从所有子目录复制具有某个扩展名的所有文件

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

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

这个命令的问题是:

  • 它也会复制目录结构,我只需要这些文件(因此所有文件都应该放在/target _ directory/中)

  • 它不会复制文件名中带有空格的文件(这样的文件很少)

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

261958 次浏览

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

按照编写的方法,执行 find,然后将输出放到命令行中,这样 cp就无法区分分隔文件名的空格和分隔文件名的空格 内心。最好是这样

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

对于 find找到的每个文件名执行 cp,并正确地传递文件名。

您可以使用 并简单地键入,而不必执行上述所有操作

$ cp **/*.xls target_directory

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

我也遇到过类似的问题,我用以下方法解决了它:

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

'{}'";"对每个文件执行副本。

综上所述,我想出了这个版本。 这个版本也适用于我的 Mac 恢复终端。

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

它将在工作目录中并递归地在所有子目录中查找扩展名为 xsl 的文件。它将把它们全部复制到目标目录。

Cp 标志如下:

  • 保存文件的属性
  • 递归的
  • 冗长(显示什么) 复制)

我也不得不自己做这件事,我是通过父母争论来做这件事的:

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;
find [SOURCEPATH] -type f -name '[PATTERN]' |
while read P; do cp --parents "$P" [DEST]; done

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

2022年,zsh 解决方案也可以在 Linux Bash 中使用:

cp **/*.extension /dest/dir

正如预期的那样。