2011-12-15 78 views
2

我有一个名为“week1”的文件夹,并且在该文件夹中有大约十个其他文件夹全部包含多个文件,其中包括一个名为“submit.pdf”的文件夹。我希望能够将所有“submit.pdf”文件复制到一个文件夹中,理想情况下使用终端来加快此过程。我试过cp week1/*/submit.pdf week1/以及cp week1/*/*.pdf week1/,但它只能复制一个文件。我只是意识到它每次都在写每个文件,这就是为什么我被困在一个......有反正我可以防止这种情况发生吗?如何使用终端从多个文件夹复制和重命名文件?

+0

is * submit.pdf *文件夹的名称? (顺便说一句,它看起来像你使用BASH或其他shell来做到这一点,而不是终端。终端(大概)是Mac OS X应用程序。) – kojiro 2011-12-15 17:54:27

+0

submit.pdf是我想要的文件的名称复制。另外,我正在使用终端应用程序,但它在标题栏上显示`bash`,所以必须是shell。虽然我不知道这意味着什么。 – Travis 2011-12-15 21:25:47

+1

终端可让您“进入”文本实用程序。你正在运行的shell是`bash`,Bourne Again SHell,它是Bourne Shell的Gnu版本。 – BRFennPocock 2011-12-15 22:22:24

回答

2

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

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

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

...这将产生一个名为类似文件“week1-子目录提交。PDF”

对于它的价值,在"${var/s/r}"符号表示采取VAR,但将它的值之前,搜索小号\/,意为/,躲过因为在表达式中的其他特殊/的)与[R-)替换它,使唯一的文件名

编辑:有实际上是一个/在T这里,使其匹配多次,使语法如下:

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

find来救援!经验法则:如果你可以用find列出你想要的文件,你可以复制它们。所以首先尝试这样的:

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

一些注意事项:

  • find .意味着 “开始从当前目录下找到”
  • -type -f手段 “只能找到普通文件”(即不是目录)
  • -iname 'submit.pdf'“...不区分大小写的名称'submit.dpf'”。你不需要使用'quotation',但是如果你想使用通配符搜索,你需要。例如: -

    ~ 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 \; 

希望这有助于!

相关问题