File-Copy

如何在不失去父目錄的情況下將多個同名文件從子目錄複製到另一個目錄?

  • August 7, 2016

在將圖像文件從另一個 Android 項目複製到我目前的項目時,我幾乎沒有什麼不便。

假設我在Project1 目錄下nice_little_icon.png的每個目錄drawable-ldpidrawable-mdpidrawable-hdpidrawable-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

您可以使用該命令( andpax的標準化替換)。此命令存在於所有符合 POSIX 的系統上,但請注意某些 Linux 發行版在其預設安裝中省略了它。複製目標目錄下的每個路徑。tar``cpio``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/

您可以使用rsync.

rsync -avzh -n --include='*/' --include='*nice_little_icon.png' --exclude='*' Project1/../res/ Project2/../res/

這只會複製呼叫nice_little_icon.pngfrom Project1/../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/
drawable-mdpi/nice_little_icon.png
...

它應該看起來像這樣(即父目錄,只有文件nice_little_icon.png)。如果看起來沒問題,請從命令中刪除-n以實際執行操作並複製文件

引用自:https://unix.stackexchange.com/questions/301896