我想批量复制和重命名的所有文件从一个目录,递归。
我有这样的东西:
/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中做到这一点?
发布于 2011-08-10 02:15:39
试着做某事如下所示:
num=0
for i in `find -name "*.aa"`; do
let num=num+1
cp $i newdir/$lc.xx
done发布于 2011-08-10 03:05:22
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发布于 2011-08-10 03:20:23
我将尝试回答这个问题,但这可能不是最佳解决方案,因为有许多工具可以用于此。
我解决这个问题的方法是编写一个函数,然后将该函数应用于目录/子目录中的每个文件。假设您有多个内核/处理器,并且您的函数将执行比重命名和复制文件更消耗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但对于重命名和复制来说,这真的不是必需的。
https://stackoverflow.com/questions/7000688
复制相似问题