166 cp
我有一个文件夹结构,其中有一堆散布在文件夹中的 *.csv 文件。现在我想将所有 *.csv 文件复制到另一个保持文件夹结构的目的地。
它的工作原理是:
cp --parents *.csv /target
cp --parents */*.csv" /target
cp --parents */*/*.csv /target
cp --parents */*/*/*.csv /target
...
Run Code Online (Sandbox Code Playgroud)
等等,但我想使用一个命令来完成。
msb*_*msb 182
find有一个非常方便的-exec选项:
find . -name '*.csv' -exec cp --parents \{\} /target \;
Run Code Online (Sandbox Code Playgroud)
Dub*_*ubu 73
您也可以rsync为此使用。
$ rsync -a --prune-empty-dirs --include '*/' --include '*.csv' --exclude '*' source/ target/
Run Code Online (Sandbox Code Playgroud)
如果要保留源树中的空目录,请跳过该--prune-empty-dirs选项:
$ rsync -a --include '*/' --include '*.csv' --exclude '*' source/ target/
Run Code Online (Sandbox Code Playgroud)
如果你不希望符号链接,修改日期,文件权限,业主等保存完好,请更换-a与另一组合-rlptgoD。;-)
小智 46
find . -name '*.csv' | cpio -pdm /target
Run Code Online (Sandbox Code Playgroud)
这将在当前目录和下面找到所有 .csv 文件并将它们复制到 /target 维护根目录结构.。
如果你使用
find /path/to/files -name '*.csv' | cpio -pdm /target
Run Code Online (Sandbox Code Playgroud)
它会找到里面/path/to/files和下面的所有文件,并将它们复制到/target/path/to/files下面。
Kyl*_*and 34
该cp命令允许多个源参数:
cp **/*.csv --parents ../target
Run Code Online (Sandbox Code Playgroud)
警告:我在这里使用递归全局;这是globstarBash 4+ 和 中的选项ksh,并且在zsh. 递归 glob不匹配隐藏文件和文件夹,一些实现遵循符号链接,而另一些则不。
如果您的 shell 不支持递归全局变量,或者您不想使用它们,您可以执行以下操作:
*.csv */*.csv */*/*.csv */*/*/*.csv -- 这当然是非常多余的,需要知道你的目录结构有多深。$(find . -name '*.csv')-- 这将匹配隐藏的文件和文件夹。find还支持指定是否遵循符号链接,这可能很有用。mar*_*rko 25
这个对我有用:
find -name "*.csv" | xargs cp --parents -t /target
如果您的文件名带有空格,请添加选项-print0和-0评论之一中的建议:
find -name "*.csv" -print0 | xargs -0 cp --parents -t /target
Ger*_*mia 11
Fromrsync的联机帮助页:
-R, --相对
使用相对路径。这意味着在命令行上指定的完整路径名被发送到服务器,而不仅仅是文件名的最后部分。当您想同时发送多个不同的目录时,这尤其有用。例如,如果您使用此命令:
Run Code Online (Sandbox Code Playgroud)rsync -av /foo/bar/baz.c remote:/tmp/...这将在远程机器上的 /tmp/ 中创建一个名为 baz.c 的文件。如果你使用
Run Code Online (Sandbox Code Playgroud)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/
Run Code Online (Sandbox Code Playgroud)
假设您要从./sourceto复制此结构./destination:
cd source
find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)
Run Code Online (Sandbox Code Playgroud)
我准备把它算作一行,cd source作为一个内置的 shell。