我有一个名为“week1”的文件夹,在该文件夹中还有大约十个其他文件夹,它们都包含多个文件,包括一个名为“submit.pdf”的文件夹。我希望能够将所有“submit.pdf”文件复制到一个文件夹中,最好使用终端来加快进程。我也试过cp week1/*/submit.pdf week1/
了cp week1/*/*.pdf week1/
,但它最终只复制了一个文件。我刚刚意识到它每次都在写入每个文件,这就是为什么我被困在一个文件中......无论如何我可以防止这种情况发生吗?
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 ( \/
,meaning /
,因为该表达式中的其他特殊而转义/
),并将其替换为r ( -
),以生成唯一的文件名。
编辑:实际上还有一个 /
,使它匹配多次,使语法:
"${ var / / \/ / - }"
take "var" replace every instance of / with -
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 \;
希望这可以帮助!