Rename

批量重命名文件名,包括空格和模式

  • April 5, 2019

我想重命名一堆以一般形式命名的文件,

text1 text2 [firstname.lastname] text3 ... textn.ext

我想[firstname.lastname]從文件名中刪除文本。為了簡化任務,假設[firstname.lastname]所有文件的名字和姓氏都是固定的。

我使用 Ubuntu 12.04,並嘗試了以下命令,

$ find . -name "*.ext" -print | xargs sed -i 's/[firstname.lastname]//g'

但它不起作用。

sed修改文件的內容。改為使用rename

$ find . -name "*.ext" -print0 | xargs -0 rename 's/\[firstname\.lastname\]//g'

傳遞旗幟以使其進行空執行rename-n這樣,您可以在不實際重命名任何文件的情況下測試您的命令。

我還對程式碼進行了其他一些更改。

  • 添加-print0tofind-0toxargs允許命令處理空格。預設情況下,find使用換行符分隔它輸出的文件名,並xargs期望接收由空格分隔的文件名。-print0並使-0這兩個命令將空字節視為文件名分隔符。有關更多資訊,請參閱此問題
  • rename使用Perl 正則表達式,它特別對待.,[]。在這種情況下,他們必須逃脫。

使用 Bash 萬用字元:

for i in *.ext; do
   echo mv -nv -- "$i" "${i/firstname.lastname/}"
done

如果您對它感到滿意,請移除迴聲。


如果您需要進入子目錄:

shopt -s globstar
for i in **/*.ext; do
   echo mv -nv -- "$i" "${i/firstname.lastname/}"
done

echo滿意時刪除。


使用find

find . -name '*.ext' -exec bash -c 'echo mv -nv -- "$0" "${0/firstname.lastname/}"' {} \;

echo滿意時刪除。


一個重命名的方法怎麼樣,刪除表單的任何模式xxx.yyy(所以它會刪除firstname.lastname文件名的,是john.doeor james.brown):為此(使用第一種方法):

shopt -s extglob
for i in *.ext; do
   echo mv -nv -- "$i" "${i/+([[:graph:]])\.+([[:graph]])/}"
done

或使用第二種方法:

shopt -s globstar extglob
for i in **/*.ext; do
   echo mv -nv -- "$i" "${i/+([[:graph:]])\.+([[:graph:]])/}"
done

或使用以下find方法:

find . -name '*.ext' -exec bash -c 'shopt -s extglob; echo mv -nv -- "$0" "${0/+([[:graph:]])\.+([[:graph:]])/}"' {} \;

如果firstname.lastname模式總是包含在空格之間,您還可以使用模式替換:

"${i/*([[:space:]])+([[:graph:]])\.+([[:graph:]])*([[:space:]])/ }"

以便只留一個空間。


*筆記。*對於帶有空格和其他有趣符號的文件名,所有這些方法都是 100% 安全的。

引用自:https://unix.stackexchange.com/questions/81657