2016-11-30 76 views
1

我已经看到接近这个问题,但我还没有看到我需要的确切答案,似乎无法让我的头包裹正则表达式,awk,sed,grep ,重命名我需要做到这一点。批量重命名文件重新排列基于分隔符的文件名

我有一个目录中的文件,从一个不同目录的多个子目录中按顺序命名,这个目录是使用find通过管道传递给xargs的。

命令我使用:       

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

这导致包含重复的文件名依次命名为第二目录如下:

<name> png格式
<name> .PNG〜1〜
<name> .png。〜2〜
...。 <name>巴纽〜N〜

我想要做的就是采取一切文件结尾的〜*〜和如下其重命名为:。

<name>#PNG      ,其中“# “是文件名末尾的”〜“之间的数字

任何帮助,将不胜感激。

回答

0

Perl的rename(独立命令):

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

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

+0

赛勒斯一个小的shell脚本 - 非常感谢你,非常完美。 – hmatthewsims

+0

赛勒斯向前迈进了一步,现在如何处理文件扩展名是什么,无论是PNG,jpg,jpeg,ico等,它都会使用正确的扩展名。 – hmatthewsims

+0

我已经更新了我的答案。请看看:[我应该怎么做当有人回答我的问题?](http://stackoverflow.com/help/someone-answers) – Cyrus

0

有可能是这更简单的方法,但在这里是用grepawk达到你想要的东西

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

我应该在问题中提到,我正在寻找一个单行的答案 - 赛勒斯上面提供的。 – hmatthewsims