Answers:
人们为什么拒绝使用find的任何原因-exec
?非常方便。
find . -name '*.csv' -exec cp --parents \{\} /target \;
了解您的工具。;-)
'{}'
效果也很好
-execdir
比更加安全-exec
,但是简单地将一个替换为另一个并不能保持预期的文件夹结构。
您也可以使用rsync
它。
$ rsync -a --prune-empty-dirs --include '*/' --include '*.csv' --exclude '*' source/ target/
如果要保留源树中的空目录,请跳过以下--prune-empty-dirs
选项:
$ rsync -a --include '*/' --include '*.csv' --exclude '*' source/ target/
如果你不希望符号链接,修改日期,文件权限,业主等保存完好,请更换-a
与另一组合-rlptgoD
。;-)
-m
是的快捷方式--prune-emty-dirs
。
-R
可以添加该选项以复制源的父目录结构。(请参阅我的回答。)
该cp
命令允许多个源参数:
cp **/*.csv --parents ../target
CAVEAT:我在这里使用递归glob;这是globstar
Bash 4+和中的选项ksh
,并且默认情况下受支持zsh
。递归glob 与隐藏的文件和文件夹不匹配,某些实现遵循符号链接,而其他实现则不匹配。
如果您的shell不支持递归glob,或者您不想使用它们,则可以执行以下操作:
*.csv */*.csv */*/*.csv */*/*/*.csv
-当然这是非常多余的,并且需要知道目录结构的深度。$(find . -name '*.csv')
-这将匹配隐藏的文件和文件夹。find
还支持指定是否遵循符号链接,这可能很有用。shopt -s globstar
命令之前立即执行了此操作,因此一切都很好。感谢您的跟进!
--parents
是我一直在寻找的东西。谢谢
这个为我工作:
find -name "*.csv" | xargs cp --parents -t /target
find [things] | xargs [do stuff]
非常强大。
find -print0
和来处理文件名中的空格xargs -0
。
从rsync
的联机帮助页:
-R,-相对
使用相对路径。这意味着在命令行上指定的完整路径名将发送到服务器,而不仅仅是文件名的最后一部分。当您要同时发送多个不同的目录时,此功能特别有用。例如,如果使用此命令:
rsync -av /foo/bar/baz.c remote:/tmp/
...这将在远程计算机上的/ tmp /中创建一个名为baz.c的文件。相反,如果您使用
rsync -avR /foo/bar/baz.c remote:/tmp/
然后将在远程计算机上创建一个名为/tmp/foo/bar/baz.c的文件,并保留其完整路径。这些额外的路径元素称为“隐式目录”(即上例中的“ foo”和“ foo / bar”目录)。
因此,这也将起作用:
rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/