2010-07-19 87 views
3

我有很多文件的名字以'_100.jpg'結尾。它們在嵌套的文件夾/子文件夾中傳播。現在我想要一個詭計遞歸地複製和重命名所有這些後綴爲'_crop.jpg'的後綴。不幸的是,我不熟悉bash腳本,所以不知道做這件事的確切方法。我用google搜索了一下,並且用'-exec'para嘗試了'find'命令,但沒有運氣。Bash:遞歸複製和重命名文件

Plz幫助我。謝謝。

+0

相關問題:[更好的方式基於多個模式重命名文件](http://stackoverflow.com/a/25597051/2654678)。 – 2014-08-31 23:11:44

回答

6
find bar -iname "*_100.jpg" -printf 'mv %p %p\n' \ 
    | sed 's/_100\.jpg$/_crop\.jpg/' \ 
    | while read l; do eval $l; done 
+0

非常好!這是我閱讀過這個主題的最簡單的解決方案!當我讀到它時,我只是想知道爲什麼我自己找不到它!也許B/C我不夠聰明:) – PierrOz 2010-09-24 15:14:02

2

,如果你有bash的4

shopt -s globstar 
for file in **/*_100.jpg; do 
    echo mv "$file" "${file/_100.jpg/_crop.jpg}" 
one 

或使用發現

find . -type f -iname "*_100.jpg" | while read -r FILE 
do 
    echo mv "${FILE}" "${FILE/_100.jpg/_crop.jpg}" 
done 
+0

缺少引號,不適用於包含換行符的文件名。使用'find ... -exec'或'find ... -print0 |而不是xargs -0'。 – Philipp 2010-07-19 10:07:36

+0

是的,缺少引號並修復。所以不需要使用xargs。接受的答案沒有報價。 – ghostdog74 2010-07-19 10:21:23

1

此使用您可能已經在你的系統上的Perl腳本。它有時也被稱爲prename而不是rename

find /dir/to/start -type f -iname "*_100.jpg" -exec rename 's/_100/_crop' {} \; 

可以使正則表達式更強大的,如果你需要保護某些文件名「_100」重複或你不想改了名字的部分。