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


112

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

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

此命令的问题是:

  • 它还会复制目录结构,并且我只需要文件(因此所有文件都应以/ target_directory /结尾)

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

这些问题有解决方案吗?


find... exec mv
fedorqui'SO停止伤害

Answers:


174

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

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

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

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

除了上述所有方法,您还可以使用zsh并简单地键入

$ cp **/*.xls target_directory

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


2
是。“ bin it”意味着将其丢弃。现在修订:-)
Brian Agnew

13
Bash4.0及更高版本,ksh93还支持**。对于bash,shopt -s globstar请启用它。对于ksh,它是set -Gset -o globstar
pynexj 2013年

2
@Daryl-我已进一步填写。但是,答案已经被标记为“接受”,请注意
Brian Agnew

5
从技术上讲,该执行程序的效率低于传递给xargs的效率,后者将通过尽可能少的cp调用来完成所有工作: find . -name '*.xls' -print0 | xargs -0 cp -t destdir
Taywee

2
@BrianAgnew哦,我敢肯定,在评论中为多余的Googlers提供更多信息是很好的。
Taywee '16

37

基于以上所有,我想到了这个版本。这个版本在Mac恢复终端中也对我有用。

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

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

cp标志是:

  • p-保留文件的属性
  • r-递归
  • v-详细(显示复制的内容)

1
这与SSH进入Bluehost时的操作相同。
Plummer

4
它不保存子目录。
b005t3r

3
@ b005t3r是设计使然,不应该这样。这就是《任择议定书》问题的全部意图。他希望将子目录中的所有文件复制到一个没有子目录的目录中
-Madivad

2
有没有办法修改它以保留子目录?
马修·迪恩

8

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

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

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


3

我也必须自己做。我通过cp的--parents参数完成了此操作:

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.