ChatGPT解决这个技术问题 Extra ChatGPT

从所有子目录复制所有具有特定扩展名的文件

在unix下,我想将所有具有特定扩展名的文件(所有excel文件)从所有子目录复制到另一个目录。我有以下命令:

cp --parents `find -name \*.xls*` /target_directory/

这个命令的问题是:

它也复制目录结构,我只想要文件(所以所有文件都应该在 /target_directory/ 中结束)

它不会复制文件名中带有空格的文件(很多)

这些问题有什么解决办法吗?

find... exec mv 呢?
这个问题实际上回答了我来这里问的问题。谢谢你!

B
Brian Agnew

--parents 正在复制目录结构,因此您应该摆脱它。

按照您的编写方式,find 会执行,并且输出会被放到命令行中,这样 cp 就无法区分分隔文件名的空格和 within 的空格文件名。最好做类似的事情

$ find . -name \*.xls -exec cp {} newDir \;

其中对 find 找到的每个文件名执行 cp,并正确传递文件名。 Here's more info 关于这项技术。

除了以上所有内容,您可以使用 zsh 并简单地键入

$ cp **/*.xls target_directory

zsh 可以扩展通配符以包含子目录,并使此类事情变得非常容易。


是的。 “bin it”是扔掉的意思。现在修改:-)
Bash 4.0+ 和 ksh93 也支持 **。对于 bash,使用 shopt -s globstar 启用它。对于 ksh,它是 set -Gset -o globstar
从技术上讲,该 exec 的效率低于传入 xargs,后者将在尽可能少的 cp 调用中完成所有操作:find . -name '*.xls' -print0 | xargs -0 cp -t destdir
@Taywee - 是的。但是,我不想混淆问题,而只是专注于特定问题。进一步的效率措施总是好的
@BrianAgnew 哦,我敢肯定,在评论中为任性的谷歌人提供额外信息真是太好了。
g
guya

根据以上所有,我想出了这个版本。这个版本也适用于我的 mac 恢复终端。

find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';'

它将在当前目录中查找并递归地在所有子目录中查找具有 xsl 扩展名的文件。它会将它们全部复制到目标目录。

cp 标志是:

p - 保留文件的属性

- 递归

- 详细(显示正在复制的内容)


这与通过 SSH 连接到 Bluehost 时我必须做的事情相同。
它不保留子目录。
@b005t3r 这是设计使然,它不应该。这就是 OP 问题的全部意图。他希望将子目录中的所有文件复制到一个没有子目录的目录中
有没有办法修改它以保留子目录?
@MatthewDean 您可以使用 --parents 标志 cp 来完成此操作。 find ./ -name '*.xsl' -exec cp --parents {} targetDir/ ';' 之类的东西
f
fhdrsdg

我有一个类似的问题。我使用以下方法解决了它:

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";"

'{}'";" 对每个文件执行复制。


T
That Guy

我自己也必须这样做。我通过 cp 的 --parents 参数做到了:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;

C
Camion
find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

您可以删除 --parents 但如果多个文件具有相同的名称,则存在冲突的风险。


Q
Quintin van Rooyen

2022 年,zsh 解决方案也适用于 Linux Bash:

cp **/*.extension /dest/dir

按预期工作。