為什麼我不能修剪這個目錄?
busybox version 1.33.0
我正在嘗試複製整個
home
文件夾。在
home
,內部/dev/sda2/
安裝,如下所示:/home/user/sda2 /home/user/sda2/root /home/user/sda2/home_backup
您可以在上面看到
root/
目錄sda2/
,由實際擁有root
。此外,還有home_backup/
哪些將儲存來自/home
.我的問題是:
執行以下行後,我得到了一個很好的文件列表,
/home/user/sda2
並且它的內容無處可尋,這正是我想要的:LC_ALL=C find /home -path /home/user/sda2 -prune -o -iname '*' -print \;
但是對於以下內容,我總是收到
operation not permitted
目錄錯誤root/
(準確,我不是所有者,普通使用者),這意味著它沒有sda2
像我預期的那樣修剪:LC_ALL=C find /home -path /home/user/sda2 -prune -o -iname '*' -exec cp -r '{}' /home/user/sda2/home_backup/ ;/
由於顯而易見的原因
/home/user/sda2
,必須排除,不要一遍又一遍地複制相同的數據。檢查這個並不能真正回答我的問題,但它讓我對如何
prune
工作有了一個概念。https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh/1489405#1489405
編輯
我剛剛意識到,在上一行中,所有文件都會混在一起,
home_backup
但這不是問題,我仍然想知道為什麼我不能正確“修剪”。
您的命令有幾個問題。然而,最重要的是你正在做一個
cp -r
.該命令
find /home ... -iname '*'
將匹配每個文件和目錄,包括/home
它自己。所以它將執行cp -r /home /home/user/sda2/home_backup/
,然後將包含該掛載。沒有理智的方法可以做到這一點
find
。基本上你使用了錯誤的工具來完成這項工作。使用rsync
. 通過-x
選項告訴它不要遞歸複製掛載。rsync -aHAXx /home /home/user/sda2/home_backup
如果由於某種原因,您不能使用
rsync
和/或您真的想使用find
,那麼您必須分多個步驟執行此操作。您需要創建目錄結構的第一步:
find /home -mount -type d -execdir mkdir -p /home/user/sda2/home_backup/{} \;
注意使用
-mount
代替-prune
。您可以使用-prune
,但-mount
更簡單。還要注意-execdir
. 這是因為它{}
被相對路徑而不是絕對路徑替換。如果你願意/home/user/sda2/home_backup/home/...
,那麼你可以使用-exec
.然後你需要復製文件
find /home -mount \! -type d -execdir cp -a {} /home/user/sda2/home_backup/{} \;
請注意,為了匹配文件,我們將匹配除目錄之外的所有內容。這是為了複製非文件,如符號連結和管道。
您可以將它們合併到一個
find
命令中,但這只會讓它變得更加混亂。所有這些細微差別都是為什麼
rsync
是一個更好的選擇。