首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批量复制和重命名多个文件

批量复制和重命名多个文件
EN

Stack Overflow用户
提问于 2011-08-10 02:03:57
回答 4查看 12.4K关注 0票数 10

我想批量复制和重命名的所有文件从一个目录,递归。

我有这样的东西:

代码语言:javascript
复制
/dir/subdir/file.aa
/dir/subdir/fileb.aa
/dir/filec.aa

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

代码语言:javascript
复制
/newdir/1.xx
/newdir/2.xx
/newdir/3.xx
/newdir/4.xx

。。/newdir/nn.xx

我如何在bash中做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-10 02:15:39

试着做某事如下所示:

代码语言:javascript
复制
num=0
for i in `find -name "*.aa"`; do
    let num=num+1
    cp $i newdir/$lc.xx
done
票数 3
EN

Stack Overflow用户

发布于 2011-08-10 03:05:22

代码语言:javascript
复制
find -name "*.aa" | cat -n | while read n f; do
    cp "$f" newdir/"$n".xx
done

可以使用(几乎)任何有效的文件名(除非其中有换行符,这也是允许的)。

如果您不局限于shell,那么python中的另一种解决方案可以是

代码语言:javascript
复制
#!/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))

然后可以将其调用为

代码语言:javascript
复制
<script name> newdir *.aa
票数 5
EN

Stack Overflow用户

发布于 2011-08-10 03:20:23

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

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

bash脚本将如下所示:

代码语言:javascript
复制
#! /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循环替换为

代码语言:javascript
复制
prll CopyAndRename $LIST

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7000688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档