Find

為什麼我不能修剪這個目錄?

  • January 19, 2022

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是一個更好的選擇。

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