Bash
從目錄和子目錄中的所有項目中刪除空格
我有一個目錄,其中包含文件和子目錄,其中一些名稱中有空格。此外,這些子目錄中的每一個都包含名稱中帶有空格的文件。有沒有一種簡單的方法可以一次從父目錄和所有子目錄中的所有名稱中刪除空格?
有沒有一種簡單的方法可以一次從父目錄和所有子目錄中的所有名稱中刪除空格?
就在這裡:
find /tmp/ -depth -name "* *" -execdir rename 's/ /_/g' "{}" \;
祝你好運!
使用該
find
命令列舉您需要重命名的文件。僅選擇帶有空格的文件名以提高性能。在對目錄本身進行操作之前,傳遞對-depth
子目錄中的文件進行操作的選項,因為在find
遍歷目錄時重命名目錄將導致失去某些目錄。find /path/to/directory -depth -name '* *' -exec … {} +
如果您有該
prename
命令,它會應用 Perl 表達式來重命名文件。您需要注意只對文件的基本名稱進行操作,而不是對整個目錄路徑。如果您find
有此-execdir
操作,這是一種方便的方法:find /path/to/directory -name '* *' -execdir prename 's/ //g' {} +
Replace
s/ //g
bys/ /_/g
用下劃線替換空格,而不是直接刪除它們,或者s/ +/_/g
用單個下劃線替換空格序列。不需要
-execdir
Perl 程式碼中的目錄避免邏輯。find /path/to/directory -depth -name '* *' -exec prename ' s:.*/::; $dir=$&; s/ //g; $_="$dir$_" ' {} +
如果沒有
prename
,可以使用 shell 腳本執行此操作。您需要從find
. 如果您有 ksh,您可以使用它的構造來獲取刪除了空格${file// /}
的變數的值(用於將每個空格替換為下劃線):file``${file// /_}
find /path/to/directory -depth -name '* *' -execdir ksh -c ' mv "$0" "${0// /}" ' {} \;
或者
find /path/to/directory -depth -name '* *' -exec ksh -c ' for file do dir=${file%/*}; file=${x##*/}; mv "$dir/$file" "$dir/${file// /}"; done ' _ {} +
如果您有 bash 或 mksh,則可以使用它來代替 ksh。如果你沒有,你可以
sed
用來做字元串處理。find /path/to/directory -depth -name '* *' -exec sh -c ' for file do dir=${file%/*}; file=${x##*/}; without_spaces=$(printf %s "$file." | sed "s/ //g") mv "$dir/$file" "$dir/${without_spaces%.}"; done ' _ {} +