2012-11-27 128 views
2

我有多个子文件夹中的文件,我想将它们全部移到一个文件夹中。 然后我喜欢重命名这些文件。命令行批量重命名

/foo/A1000-foobar1412.jpg 
/foo/A1000-foobar213.jpg 
/foo/A1000-foobar314.jpg 
/foo1/B1001-foobar113.jpg 
/foo2/C1002-foobar1123.jpg 
/foo2/C1002-foobar24234.jpg 

我想获得的是:

../bar/A1000-1.jpg 
../bar/A1000-2.jpg 
../bar/A1000-3.jpg 
../bar/B1001-1.jpg 
../bar/C1002-1.jpg 
../bar/C1002-2.jpg 

所以我做什么,到目前为止是:

find . -name "*.jpg" -exec mv {} ../bar/ \; 

但现在我被困在重命名的文件。

+0

有多少重复? http://stackoverflow.com/questions/12292232/rename-batch-of-file-in-unix; http://stackoverflow.com/questions/10977543/rename-multiple-files-linux-ubuntu; http://stackoverflow.com/questions/417916/how-to-do-a-mass-rename; http://stackoverflow.com/questions/3540490/batch-renaming-using-shell-script; ... –

+0

没有一个像我的场景... – DarsVaeda

+0

好的...因为?由于前缀内的编号? C1002有10个'.jpg'文件时应该发生什么? 'C1002-10.jpg'? 'C1002-01.jpg','C1002-02.jpg',...呢?什么决定'/ foo2/C1002-foobar1123.jpg'和'/ foo2/C1002-foobar24234.jpg'中的哪一个变成'C1002-1.jpg'?有关系吗? –

回答

2

这里是一个脚本,只是需要的文件所需的基本名称,并追加增量指标取决于如何在目标中已存在具有相同基许多文件DIR:

for file in $(find . -name "*.jpg") 
do 
    bn=$(basename $file) 
    target_name=$(echo $bn | cut -f 1 -d "-") 
    index=$(($(find ../bar -name "$target_name-*" | wc -l) + 1)) 
    target="${target_name}-${index}.jpg" 

    echo "Copy $file to ../bar/$target" 
    # mv $file ../bar/$target 
    cp $file ../bar/$target 
done 

有了这个解决方案,你不能只是把回声在MV前对其进行测试的代码依赖于真实的文件在目标目录来计算指数。取而代之的是使用cp(或rsync),并在结果满意后立即手动删除源文件。

1

试一下这个(未测试):

for file in `find . -name "*.jpg" ` 
do 
    x=$(echo $file | sed 's|.*/||;s/-[^0-9]*/-/;s/-\(.\).*\./-\1./') 
    mv $file ../bar/$x 
done 
+0

更改为'echo mv $ file ../ bar/$ x',使用该输出确认所有工作正常,然后删除echo或者以'done |结束循环。 bash'。祝你们好运。 – shellter