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