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

时间:2013-03-25 14:09:06

标签: bash unix cp

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

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

此命令的问题是:

  • 它也复制了目录结构,我只想要文件(因此所有文件应该最终放在/ target_directory /中)

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

针对这些问题的任何解决方案?

5 个答案:

答案 0 :(得分:138)

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

你写这个的方式,find执行,输出被放到命令行,这样cp无法区分分隔文件名的空格和空格< em>在文件名中。最好做一些像

这样的事情
$ find . -name \*.xls -exec cp {} newDir \;

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

您可以使用zsh而只需输入

,而不是以上所有内容
$ cp **/*.xls target_directory

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

答案 1 :(得分:25)

从以上所有内容中,我想出了这个版本。 这个版本也适用于mac恢复终端。

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

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

cp标志是:

  • p - 保留文件的属性
  • r - recursive
  • v - 详细(告诉你什么 被复制)

答案 2 :(得分:8)

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

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

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

答案 3 :(得分:3)

我自己也必须这样做。我是通过-parents参数为cp执行的:

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

答案 4 :(得分:1)

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

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