批量重命名文件根据分隔符重新排列文件名

bulk renaming files rearranging file names based on delimiter

我看到过与此接近的问题,但我没有看到我需要的确切答案,而且我似乎无法理解我需要的正则表达式、awk、sed、grep、重命名使其发生。

我在一个目录中有文件,这些文件按顺序从另一个目录的多个子目录中命名,这些子目录是使用管道到 xargs 的 find 创建的。

我使用的命令:

find `<dir1>` -name "*.png" | xargs cp -t `<dir2>`

这导致第二个目录包含重复的文件名,顺序命名如下:

<name>.png
<name>.png.~1~
<name>.png.~2~
...
<name>.png.~n~

我想做的是将所有以 ~*~ 结尾的文件重命名如下:

<name>.#.png 其中“#”是文件名末尾“~”之间的数字

如有任何帮助,我们将不胜感激。

使用 Perl 的 rename(独立命令):

rename -nv 's/^([^.]+)\.(.+)\.~([0-9]+)~/../' *

如果一切正常,请删除选项 -n

可能有更简单的方法,但这里有一个小 shell 脚本,使用 grepawk 来实现您想要的

for i in $(ls|grep ".png."); do 
name=$(echo $i|awk -F'png' '{print }');
n=$(echo $i|awk -F'~' '{print }'); 
mv $i $name$n.png; 
done