[英]BASH: recursively search through a file system and rename files
我正在嘗試搜索文件系統,如果文件是*-xxx.png
到'* .png'或*-xxx.jpg
到*.jpg
(刪除xxx
值)和*.png.bak
,則將它們重命名或*.jpg.bak
如果沒有*-xxx.ext
。 我已經在使用腳本在每個文件上執行命令
#!/bin/bash
for file in $(find . -name "*.png")
do
cp $file $file.bak
pngquant -vf $file
echo "mv $? ${file} "
done
echo $?
我還需要該腳本來備份舊文件,並將新文件重命名為舊文件名。 新文件是舊文件名,在擴展名前的文件名后面附加了-xxx
。
嘗試這樣的事情:
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.png
更改為file-xxx.png
, file.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
首先,取所有名為*-xxx.jpg
'* .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的系統上作為perl
軟件包的一部分安裝。 它不能與util-linux
軟件包中安裝的其他不兼容的 rename
實用程序一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.