2015-04-03 65 views
0

我想通過文件系統進行搜索,如果他們是*-xxx.png重命名文件「*巴紐」或*-xxx.jpg*.jpg(去除xxx值),並*.png.bak*.jpg.bak,如果他們沒有*-xxx.ext。 我已經使用腳本來對每個文件BASH:通過文件系統遞歸搜索和重命名文件

#!/bin/bash 
for file in $(find . -name "*.png") 
do 
    cp $file $file.bak 
    pngquant -vf $file 
    echo "mv $? ${file} " 
done 
echo $? 

我需要這個腳本也可以備份舊文件並重新命名新文件到舊文件名執行命令。新文件是在擴展名之前附加到文件名的-xxx的舊文件名。

+0

如果是刪除'xxx'腳本的一部分? – Barmar 2015-04-03 22:54:00

+0

pngquant -vf $文件的輸出應該是帶-xxx的文件名,並且下一行希望將其保存爲原始文件名 – Illyena 2015-04-06 22:43:06

+0

要使用'var = $(command)'將命令輸出到變量中。 '$?'包含命令的退出狀態,而不是輸出。 – Barmar 2015-04-06 22:45:05

回答

0

首先,要採取一切 '* .JPG' 除了那些命名爲*-xxx.jpg,然後添加.bak到他們的名字的結尾:

find . -name '*.jpg' ! -name '*-xxx.jpg' -exec mv {} {}.bak \; 

二,PNG文件做同樣的:

find . -name '*.png' ! -name '*-xxx.png' -exec mv {} {}.bak \; 

三,重命名所有的-xxx.jpg-xxx.png文件從他們的名字中刪除-xxx

find . \(-name '*-xxx.jpg' -o -name '*-xxx.png' \) -exec rename 's/-xxx.(jpg|png)/.$1/' {} + 

最後一個命令需要通常方便的rename實用程序在debian-like系統上安裝爲perl程序包的一部分。它不適用於與util-linux軟件包一起安裝的不同的和不兼容的rename實用程序。

0

嘗試這樣:

find . -regextype sed -regex '\(.*\.png\)\|\(.*\.jpg\)' -print0 | while read -d $'\0' img; do 
    [[ ${img} =~ - ]] && mv ${img} ${img%-*}.jpg || mv ${img} ${img}.bak 
done 

這當然,假設你想改變png擴展jpg,因爲我從你的問題的結論。如果你不希望改變,例如,file-xxx.pngfile.jpg然後使用下面的代碼:

for ext in jpg png; do 
    find . -name *${ext} -print0 | while read -d $'\0' img; do 
     [[ ${img} =~ - ]] && mv ${img} ${img%-*}.${ext} || mv ${img} ${img}.bak 
    done 
done 
+0

no我不會將.png更改爲.jpg,Im優化了.png和.jpg文件,這些文件使用另外的-xxx字符串將新的優化文件保存在新文件的名稱中。所以我有file1.jpg,file1-xxx.jpg,file2.png和file-xxx.png,我需要file1.jpg和file2.png成爲file1.jpg.bak和file2.png.bak,然後離開file1-xxx.jpg的空間變成file1.jpg和file2-xxx的空間變成file2.png – Illyena 2015-04-06 22:48:09

+0

然後在你的文章中改變這個:「重命名文件,如果它們是'* -xxx.png'或'* -xxx.jpg '到'* .jpg'「。第二塊代碼應該適合你。 – ShellFish 2015-04-08 03:39:09