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