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