Rename
批量重命名文件名,包括空格和模式
我想重命名一堆以一般形式命名的文件,
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'
但它不起作用。
$ find . -name "*.ext" -print0 | xargs -0 rename 's/\[firstname\.lastname\]//g'
傳遞旗幟以使其進行空執行
rename
。-n
這樣,您可以在不實際重命名任何文件的情況下測試您的命令。我還對程式碼進行了其他一些更改。
- 添加
-print0
tofind
和-0
toxargs
允許命令處理空格。預設情況下,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.doe
orjames.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% 安全的。