Shell

在沒有無限循環的情況下將父目錄複製到子目錄中

  • May 29, 2015

出於應用程序特定的原因,我需要將整個父目錄複製到子目錄中。例如,

cp -r ../ tmp/

這樣做的問題是它陷入了無限循環,一遍又一遍地遞歸複製 tmp/ 的內容。

有很多方法可以解決這個問題,比如 tar 目錄並將其解壓縮到 tmp 中,但我想知道是否有任何特別優雅/unixy 的解決方案。

(注意:我使用的是 Apple OS/X)。

如果您從父目錄開始,您可以使用findGNU來執行此操作cp。假設您目前所在的目錄(包含 的目錄tmp)被呼叫folder,並且tmp為空,您將執行

cd ..
find . -path ./folder/tmp -prune -o -type f -exec cp --parents -t folder/tmp {} +

這要求 find 列出.(這是您的舊的..)下的所有內容,如果匹配則排除它./folder/tmp,否則如果它是一個文件,則cp使用--parents選項將其傳遞給(它告訴cp重建源層次結構)。

如果tmp已經有需要複製的文件,則以下變體略少 Unix-y(因為它使用moreutilssponge)但避免跳過 的內容tmp

cd ..
find . -type f -print0 | sponge | xargs -0 cp --parents -t folder/tmp

sponge您可以通過將要複製的文件列表保存在其他地方的文件中來避免使用(但事情變得不那麼優雅了):

cd ..
find . -type f -print0 > /tmp/filelist
xargs -0 cp --parents -t folder/tmp < /tmp/filelist
rm /tmp/filelist

cp您可以通過使用來避免對 GNU 的要求cpio

cd ..
find . -type f -print0 > /tmp/filelist
cpio -pmd0 folder/tmp < /tmp/filelist
rm /tmp/filelist

或者

cd ..
find . -type f -print0 | sponge | cpio -pmd0 folder/tmp

如果tmp為空,您也可以避免對moreutils:

cd ..
find . -path ./folder/tmp -prune -o -type f -print0 | cpio -pmd0 folder/tmp

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