簡體   English   中英

BASH:遞歸搜索文件系統並重命名文件

[英]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.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

首先,取所有名為*-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM