Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从所有子目录复制具有特定扩展名的所有文件_Bash_Unix_Cp - Fatal编程技术网

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

Bash 从所有子目录复制具有特定扩展名的所有文件,bash,unix,cp,Bash,Unix,Cp,在unix下,我想将所有具有特定扩展名的文件(所有excel文件)从所有子目录复制到另一个目录。我有以下命令: cp --parents `find -name \*.xls*` /target_directory/ 此命令存在以下问题: 它还复制了目录结构,我只需要这些文件(因此所有文件都应该位于/target\u directory/) 它不会复制文件名中带有空格的文件(这些空格相当多) 有没有解决这些问题的方法?--父目录正在复制目录结构,因此您应该摆脱它 按照您编写此文件的方式,f

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

cp --parents `find -name \*.xls*` /target_directory/
此命令存在以下问题:

  • 它还复制了目录结构,我只需要这些文件(因此所有文件都应该位于/target\u directory/)

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

有没有解决这些问题的方法?

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

按照您编写此文件的方式,
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标志为:

  • p-保留文件的属性
  • r-递归
  • v-详细(向您显示 (正在复制)

    • 我自己也必须这样做。我是通过--parents的cp论证做到的:

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

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

      关于
      find。。。exec mv
      ?这个问题的可能重复事实上回答了我来这里要问的问题。非常感谢。是的意思是把它扔掉。现在修改:-)
      Bash
      4.0+和
      ksh93
      也支持
      **
      。对于bash,使用
      shopt-s globstar
      启用它。对于ksh,它是
      set-G
      set-o globstar
      。从技术上讲,exec的效率低于传递到xargs,而xargs只需尽可能少的cp调用:
      find-名称'*.xls'-print0 | xargs-0 cp-t destdir
      @Taywee-yes。然而,我不想把事情搞混,只想把重点放在特定的问题上。始终需要进一步的效率措施good@BrianAgnew哦,我敢肯定,很高兴在评论中为任性的谷歌用户提供额外的信息。这与我在SSH进入Bluehost时所做的相同。它不保留子目录。@b005t3r这是设计上的,不应该保留。这就是OP问题的全部意图。他希望将子目录中的所有文件复制到一个没有子目录的目录中。有没有办法修改此文件以保留子目录?@matthewden您可以使用
      --parents
      标志来实现这一点。类似于
      find./-name'*.xsl'-execcp--parents{}targetDir/';'
      
      find [SOURCEPATH] -type f -name '[PATTERN]' | 
          while read P; do cp --parents "$P" [DEST]; done