在find -exec中,如何用{}取代目前檔案?

在find -exec中,如何用{}取代目前檔案?

我想找到所有不屬於我的文件(即無權修改它)。我努力了

find . -exec if [[ ! -O {} ]]; then echo {}; fi ;

但是如果我將整個命令放在-exec引號中,如下所示:

find . -exec 'if [[ ! -O {} ]]; then echo {}; fi' \;

這都不起作用,因為對當前文件的引用{}用引號引起來,因此不會擴展到該文件。

問題是,我不知道如何將{}當前文件嵌入到比簡單的更複雜的文件-execfind . -exec grep smf {} \;(僅使用{}一次)。如何-exec在指令中使用 find 選項,多次引用目前檔案? (即使用{}更多時間)。

答案1

您的程式碼無法運行,因為您要求find運行的實用程式if不存在(它是 shell 語法中的關鍵字)。

-O如果參數是目前使用者擁有的文件,則測試為 true 。可以find使用以下命令自行完成相同的測試-user "$USER"(假設$USER擴展到目前使用者):

find . -type f ! -user "$USER"

test -O如果您的外部test實用程式支援該非標準測試,您也可以使用(檢查man test):

find . -type f ! -exec test -O {} \; -print

如果您仍然想要或需要使用shell-O中內建的測試bash,那麼您必須產生一個bashshell 來執行測試:

find . -type f -exec bash -c '[[ ! -O "$1" ]]' bash {} \; -print

bash -c將為每個找到的檔案啟動一個內聯腳本,並對其第一個參數 ( ) 執行測試$1。參數在腳本的命令列上傳遞findbash前面的字串{}將放置在$0腳本內部,並將由該 shell 用於顯示錯誤訊息)。如果測試為真(該文件不屬於您),-print則生效並列印文件的路徑名。

您可以更有效地執行此操作

find . -type f -exec bash -c '
    for pathname do
        [[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
    done' bash {} +

這更有效,因為它將批次的找到的路徑名稱傳遞給bash -c腳本。

……但使用-user "$USER"將是更好的選擇。

也可以看看:

相關內容