我想以递归方式批量复制和重命名目录中的所有文件。
我有这样的事情:
/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中执行此操作?
答案 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
但这对于重命名和复制来说并不是必需的。