我想找到所有不屬於我的文件(即無權修改它)。我努力了
find . -exec if [[ ! -O {} ]]; then echo {}; fi ;
但是如果我將整個命令放在-exec
引號中,如下所示:
find . -exec 'if [[ ! -O {} ]]; then echo {}; fi' \;
這都不起作用,因為對當前文件的引用{}
用引號引起來,因此不會擴展到該文件。
問題是,我不知道如何將{}
當前文件嵌入到比簡單的更複雜的文件-exec
中find . -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
,那麼您必須產生一個bash
shell 來執行測試:
find . -type f -exec bash -c '[[ ! -O "$1" ]]' bash {} \; -print
這bash -c
將為每個找到的檔案啟動一個內聯腳本,並對其第一個參數 ( ) 執行測試$1
。參數在腳本的命令列上傳遞find
(bash
前面的字串{}
將放置在$0
腳本內部,並將由該 shell 用於顯示錯誤訊息)。如果測試為真(該文件不屬於您),-print
則生效並列印文件的路徑名。
您可以更有效地執行此操作
find . -type f -exec bash -c '
for pathname do
[[ ! -O "$pathname" ]] && printf "%s\n" "$pathname"
done' bash {} +
這更有效,因為它將批次的找到的路徑名稱傳遞給bash -c
腳本。
……但使用-user "$USER"
將是更好的選擇。
也可以看看: