Shell
在沒有無限循環的情況下將父目錄複製到子目錄中
出於應用程序特定的原因,我需要將整個父目錄複製到子目錄中。例如,
cp -r ../ tmp/
這樣做的問題是它陷入了無限循環,一遍又一遍地遞歸複製 tmp/ 的內容。
有很多方法可以解決這個問題,比如 tar 目錄並將其解壓縮到 tmp 中,但我想知道是否有任何特別優雅/unixy 的解決方案。
(注意:我使用的是 Apple OS/X)。
如果您從父目錄開始,您可以使用
find
GNU來執行此操作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(因為它使用moreutils
’sponge
)但避免跳過 的內容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