![如何将子目录中的多个同名文件复制到另一个目录而不丢失父目录?](https://linux22.com/image/91977/%E5%A6%82%E4%BD%95%E5%B0%86%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E5%A4%9A%E4%B8%AA%E5%90%8C%E5%90%8D%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E5%88%B0%E5%8F%A6%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%E8%80%8C%E4%B8%8D%E4%B8%A2%E5%A4%B1%E7%88%B6%E7%9B%AE%E5%BD%95%EF%BC%9F.png)
将图像文件从另一个 Android 项目复制到当前项目时,我遇到了一些不便。
假设我在Project1 目录下的每个nice_little_icon.png
目录drawable-ldpi
、drawable-mdpi
、和中调用了文件。drawable-hdpi
drawable-xhdpi
drawable-xxhdpi
res
现在如何res
使用单个 Linux/Unix 命令将这些文件复制到 project2 的目录中?
所以我的最终结果看起来像
Project1/../res/drawable-ldpi/nice_little_icon.png -> Project2/../res/drawable-ldpi/nice_little_icon.png
Project1/../res/drawable-mdpi/nice_little_icon.png -> Project2/../res/drawable-mdpi/nice_little_icon.png
Project1/../res/drawable-hdpi/nice_little_icon.png -> Project2/../res/drawable-mdpi/nice_little_icon.png
Project1/../res/drawable-xhdpi/nice_little_icon.png -> Project2/../res/drawable-xhdpi/nice_little_icon.png
Project1/../res/drawable-xxhdpi/nice_little_icon.png -> Project2/../res/drawable-xxhdpi/nice_little_icon.png
答案1
您可以使用rsync
。
rsync -avzh -n --include='*/' --include='*nice_little_icon.png' --exclude='*' Project1/../res/ Project2/../res/
这只会复制nice_little_icon.png
从Project1/../res/*
to调用的文件Project2/../res/
,并且如果文件的父目录( 、 等)不存在,则会drawable-ldpi
在drawable-ldpi
其下Project2/../res/
创建它们。
解释一下rsync
命令:
-avzh
:-a
基本上意味着“递归,并保留时间戳、权限和其他一些东西”,-v
意味着详细,-z
意味着在传输时压缩文件(不是真正需要的,但我还是喜欢使用它),-h
意味着以人类可读的方式打印。-n
: 表示试运行。所以运行这个命令不会做任何事情。您需要删除它才能真正使命令采取行动。--include='*/' --include='*nice_little_icon.png' --exclude='*'
rsync
:这基本上是告诉仅复制以 结尾的文件nice_little_icon.png
并排除其他所有内容的方法。Project1/../res/
:源目录。最后/
是非常重要的是,它的意思是“复制任何内容”在下面res/
'。如果您删除了该目录/
,它会将实际目录复制res
到目标,这不是您想要的。Project2/../res/
: 目标目录。
当您运行上述命令时,它将显示它将要执行的操作(即它将复制哪些目录和文件):
./ 可绘制-hdpi/ 可绘制-hdpi/nice_little_icon.png 可绘制-mdpi/ 可绘制-mdpi/nice_little_icon.png ...
它应该看起来像这样(即父目录,并且只有文件nice_little_icon.png
)。如果看起来还不错的话从命令中删除-n
,使其实际执行操作并复制文件。
答案2
您可以使用pax
tar
命令(和 的标准化替代cpio
)。此命令存在于所有 POSIX 兼容系统上,但请注意,某些 Linux 发行版在默认安装中省略了它。pax
复制目标目录下的每个路径。
pax -rw -pe drawable-*/nice_little_icon.png ../../Project2/res/
-s
您可以使用该选项来忽略某些文件,而不是依赖 shell 中的通配符。
pax -rw -pe -'s!^drawable-[^/]*/nice_little_icon\.png$!&!' -'s!.*/.*!!' drawable-* ../../Project2/res/