我使用以下命令清除超過 30 天的文件和目錄的目錄,並將它們移至存檔目錄,如果沒有人索取文件,我可以在幾週後刪除該目錄。目標目錄依使用者名稱有子目錄,存檔目錄也有。
這是我使用的命令:
find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;
我建議對此進行修改,以回答詢問 ubuntu 上的問題,另一位用戶編輯了程式碼以更改行尾\;
,因為+
它更快(並且更正確?)。看這裡
但是,如果該命令不在我使用的實際命令中,+
則以這種方式使用是有效的。如果我嘗試使用它,我會收到一條錯誤訊息:-exec
ls -lh
+
find: missing argument to '-exec'
我不明白為什麼它會這樣,或者正確的命令是什麼。請不要只是發布命令更正,我想理解而不是盲目遵循建議。
答案1
該帖子中的用戶可能會說命令+
末尾的符號-exec
更快,但沒有說明原因。
假設該find
命令傳回以下文件:
/path/to/file1
/path/to/file2
/path/to/file3
普通-exec
指令 ( -exec command {} \;
) 對每個符合檔案執行一次。例如:
find ... -exec mv {} /target/ \;
執行:
mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/
如果使用+
符號 ( -exec command {} +
),則透過在命令末尾新增多個符合的檔案來建立命令。例如:
find ... -exec mv -t /target/ {} +
執行:
mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3
要正確使用該+
標誌,要處理的參數必須位於命令的末尾,而不是中間。這就是為什麼在你的例子中find
出現了trows ;missing argument to '-exec'
它錯過了閉幕式{}
。
答案2
用戶解釋了他們的編輯......
....使用這個連結。我認為基本上不是使用多個命令,而是將所有檔案名稱發送到一個命令實例,以加快速度。這是一個例子這裡:
使用帶有分號 (
find . -exec ls '{}' \;
) 的 -exec 將執行ls file1 ls file2 ls file3
但如果您使用加號 (
find . -exec ls '{}' \+
),則所有檔案名稱都會作為參數傳遞給單一命令:ls file1 file2 file3
還有其他形式可以使用;
和+
以及(來自這裡:)
因此,find 命令允許使用以下範例語法:
find . -exec echo {} \; find . -exec echo {} ';' find . -exec echo {} ";" find . -exec echo {} \+ find . -exec echo {} +
但是,我不確定這是否適用於 move 命令,因為它的語法是 mv [OPTION]... SOURCE DEST
,除非-t
使用選項或類似選項。然而,它應該在沒有額外選項等的情況下工作ls
,因為它們可以理解何時給出多個檔案名稱。可能+
還需要轉義(即\+
)