
我正在嘗試對我發現的東西運行多個命令,如何實現這一目標?
find . -exec cmd1; cmd2
似乎不起作用;相反,它會在對每個檔案執行 cmd1 後執行 cmd2。
答案1
在此示範中,我將使用sh -c 'echo first; false'
(或true
) 作為第一個-exec
。這將提供一些輸出,並且還具有選定的退出代碼效果。然後echo second
將用於第二個。假設目前目錄下有一個檔案。
$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
這種類型的真實命令如下所示:
find . -type f \( -exec command1 \; -false -o -exec command2 \; \)
在第二組中,轉義括號將兩個-exec
子句分組。它們-false
之間的 強制測試狀態為“false”,並-o
導致下一個表達式(第二個-exec
)被評估,因為-false
.
從man find
:
expr1 expr2
一行中的兩個表達式被視為以隱含的「and」連接;如果 expr1 為 false,則不會計算 expr2。expr1 -a expr2
與 expr1 expr2 相同。expr1 -o expr2
或;如果 expr1 為 true,則不會計算 expr2。
答案2
如果您不關心 cmd1 由於錯誤代碼而能夠阻止 cmd2 運行0
:
find . -exec cmd1 \; -exec cmd2 \;
讓這兩個命令始終運行的唯一可靠方法是呼叫find
一個 shell,該 shell 隨後將按順序運行命令:
find . -exec bash -c 'cmd1; cmd2' filedumper {} \;
答案3
如果您不介意製作一個執行 cmd1 和 cmd2 的腳本,那麼就是這樣:
find . -exec myscript {} \;
或者
find . -exec myscript {} +
使用 \;或 + 取決於 myscript 是否可以一次處理多個檔案(如果檔案名稱中有空格等,就會變得很麻煩)。
根據我的經驗,將你正在做的事情放入腳本中幾乎總是值得的。如果你必須做一次,你就必須再做一次。
但一個巧妙的技巧是把找到的裡面劇本:
if [ $# -gt 0 ]; then
for each; do
touch $each
done
else
find . -exec $0 {} +
fi
然後 myscript 可以處理您作為參數提供的任何文件,但如果您不給它任何參數,它就會從當前目錄運行 find ,然後在找到的文件上調用自身。這迴避了 find -exec 無法呼叫您在腳本中定義的 shell 函數的事實。
答案4
嘗試命令:
sudo find -name "*[!0-9][1-9].txt" -exec chmod 744 * {} \; -a -exec ls -l {} \; | sort | parallel ls -l