166

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

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

这个命令的问题是:

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

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

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

4

5 回答 5

249

--parents正在复制目录结构,所以你应该摆脱它。

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

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

其中对找到cp的每个文件名执行find,并正确传递文件名。这是有关此技术的更多信息。

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

$ cp **/*.xls target_directory

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

于 2013-03-25T14:10:28.123 回答
50

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

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

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

cp 标志是:

  • p - 保留文件的属性
  • r - 递归
  • v - 详细(显示正在复制的内容)
于 2016-05-03T18:48:27.677 回答
12

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

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

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

于 2015-01-18T22:47:48.433 回答
6

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

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;
于 2017-12-03T22:56:17.213 回答
2
find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

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

于 2019-05-13T02:11:04.957 回答