如何将子目录中的多个同名文件复制到另一个目录而不丢失父目录?

如何将子目录中的多个同名文件复制到另一个目录而不丢失父目录?

将图像文件从另一个 Android 项目复制到当前项目时,我遇到了一些不便。

假设我在Project1 目录下的每个nice_little_icon.png目录drawable-ldpidrawable-mdpi、和中调用了文件。drawable-hdpidrawable-xhdpidrawable-xxhdpires

现在如何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.pngProject1/../res/*to调用的文件Project2/../res/,并且如果文件的父目录( 、 等)不存在,则会drawable-ldpidrawable-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

您可以使用paxtar命令(和 的标准化替代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/

相关内容