批量复制并重命名多个文件

时间:2011-08-09 18:03:57

标签: bash

我想以递归方式批量复制和重命名目录中的所有文件。

我有这样的事情:

/dir/subdir/file.aa
/dir/subdir/fileb.aa
/dir/filec.aa

并希望将所有文件复制为:

/newdir/1.xx
/newdir/2.xx
/newdir/3.xx
/newdir/4.xx

.. /newdir/nn.xx

我怎样才能在bash中执行此操作?

3 个答案:

答案 0 :(得分:4)

find -name "*.aa" | cat -n | while read n f; do
    cp "$f" newdir/"$n".xx
done

将使用(几乎)任何有效的文件名(除非你有新行,也允许使用新行)。

如果你不局限于shell,python中的另一个解决方案可能是

#!/usr/bin/env python

if __name__ == '__main__':
    import sys
    import os
    import shutil
    target = sys.argv[1]
    for num, source in enumerate(sys.argv[2:]):
        shutil.move(source, os.path.join(target, "%d.xx" % num))

然后可以被称为

<script name> newdir *.aa

答案 1 :(得分:3)

试试吧。像这样:

num=0
for i in `find -name "*.aa"`; do
    let num=num+1
    cp $i newdir/$lc.xx
done

答案 2 :(得分:0)

我会尝试回答这个问题,但这可能不是最佳解决方案,因为有很多工具可以用于此。

我解决这个问题的方法是编写一个函数,然后将此函数应用于目录/子目录中的每个文件。假设您有多个内核/处理器,并且您的功能将比仅重命名和复制文件更耗费CPU,您还可以并行化任务。

bash脚本如下所示:

#! /bin/bash
n=1
CopyAndRename() {
   NEWNAME=$n.xx
   cp "$i" /newdir/$NEWNAME 
   n=$[$n+1]
}

IFS=$'\n'
LIST=`find /dir -type f`

for i in $LIST; do
   CopyAndRename $i
done

这也应该处理带有空格和其他特殊字符的文件名。对于并行化,您可以使用程序prll,然后用

替换for循环
prll CopyAndRename $LIST

但这对于重命名和复制来说并不是必需的。