BASH:递归搜索文件系统并重命名文件

时间:2015-04-03 22:50:11

标签: regex bash recursion find file-rename

我正在尝试搜索文件系统并重命名文件,如果它们是*-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附加到扩展名之前的文件名。

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

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

答案 1 :(得分: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的系统上,它是作为perl包的一部分安装的。它不适用于与rename包一起安装的不同和不兼容的 util-linux实用程序。