如何使用终端从多个文件夹中复制和重命名文件?

时间:2011-12-15 17:51:17

标签: shell unix cp

我有一个名为“week1”的文件夹,在该文件夹中还有大约十个其他文件夹都包含多个文件,包括一个名为“submit.pdf”的文件夹。我希望能够将所有“submit.pdf”文件复制到一个文件夹中,理想情况下使用终端加快进程。我已尝试cp week1/*/submit.pdf week1/以及cp week1/*/*.pdf week1/,但它最终只复制了一个文件。我只是意识到它每次都在写每个文件,这就是为什么我会坚持一个......无论如何我可以防止这种情况发生吗?

2 个答案:

答案 0 :(得分:2)

您没有指明您的操作系统,但如果您使用的是Gnu cp,则可以使用cp week1/*/submit.pdf --backup=t week/来获取已存在的(任意)数字文件;但是,这不会给你任何真正的方法来确定哪个是哪个。

你也许可以做这样的事情:

 for file in week1/*/submit.pdf; do cp "$file" "${file//\//-}"; done

...将生成名为“week1-subdir-submit.pdf”

的文件

对于它的价值,"${var/s/r}"表示法意味着采用 var ,但在插入其值之前,搜索 s \/,意味着/,由于该表达式中的其他特殊/而被转义),并将其替换为 r -),以生成唯一的文件名。

修改:其中实际上还有一个 /,以使其多次匹配,从而产生语法:

             "${ var           /        /                 \/  /      -    }"
                 take "var"    replace  every instance of /   with   -

答案 1 :(得分:1)

find救援!经验法则:如果您可以使用find列出所需的文件,则可以复制它们。所以先试试这个:

$ cd your_folder
$ find . -type f -iname 'submit.pdf'

一些注意事项:

  • find .表示“从当前目录开始查找”
  • -type -f表示“只查找常规文件”(即不是目录)
  • -iname 'submit.pdf'“...不区分大小写的名称'submit.dpf'”。您不需要使用'quotation',但如果您想使用通配符进行搜索,则需要。 E.g:

     ~ foo$ find /usr/lib -iname '*.So*'
     /usr/lib/pam/pam_deny.so.2
     /usr/lib/pam/pam_env.so.2
     /usr/lib/pam/pam_group.so.2
     ...
    

如果您想搜索区分大小写,请使用-name代替-iname

当此方法有效时,您可以使用-exec命令复制每个文件。 exec允许您指定要在命中时使用的命令。它将为每个find个文件运行命令,并将文件名放在{}中。您可以通过指定\;来结束命令序列。

所以要echo所有文件,请执行以下操作:

$ find . -type f -iname submit.pdf -exec echo Found file {} \;

逐一复制:

$ find . -type f -iname submit.pdf -exec cp {} /destination/folder \;

希望这有帮助!