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;这是globstarBash 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/