使用find時如何執行多個指令?

使用find時如何執行多個指令?

我正在嘗試對我發現的東西運行多個命令,如何實現這一目標?

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

相關內容