-exec 缺少什麼參數?

-exec 缺少什麼參數?

我使用以下命令清除超過 30 天的文件和目錄的目錄,並將它們移至存檔目錄,如果沒有人索取文件,我可以在幾週後刪除該目錄。目標目錄依使用者名稱有子目錄,存檔目錄也有。

這是我使用的命令:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

我建議對此進行修改,以回答詢問 ubuntu 上的問題,另一位用戶編輯了程式碼以更改行尾\;,因為+它更快(並且更正確?)。看這裡

但是,如果該命令不在我使用的實際命令中,+則以這種方式使用是有效的。如果我嘗試使用它,我會收到一條錯誤訊息:-execls -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

用戶解釋了他們的編輯......

'+' exec 的終止符比 '\;' 更快請參閱https://askubuntu.com/questions/558817/what-is-the-difference- Between-using-and-in-exec-command;從原始檔案建立備份檔案是個好主意

....使用這個連結。我認為基本上不是使用多個命令,而是將所有檔案名稱發送到一個命令實例,以加快速度。這是一個例子這裡:

使用帶有分號 ( 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,因為它們可以理解何時給出多個檔案名稱。可能+還需要轉義(即\+

相關內容