我注意到find ... -exec ... {} \;orxargs -i ... {}似乎只評估了一次變數或子shell(如$RANDOMor $(uuidgen)),甚至該命令也被執行了多次。
例如:
$ find . -type f -name \*.txt -exec echo "$RANDOM {}" \;
28855 ./foo/bar.txt
28855 ./foo/bar1.txt
28855 ./foo/bar2.txt
28855 ./foo/bar3.txt
28855 ./foo/bar4.txt
$ grep -lr SOME_TEXT --include=\*.txt | xargs -i echo "$RANDOM {}"
6153 ./foo/bar.txt
6153 ./foo/bar1.txt
6153 ./foo/bar2.txt
6153 ./foo/bar3.txt
6153 ./foo/bar4.txt
有沒有辦法得到如下結果?
1543 ./foo/bar.txt
543 ./foo/bar1.txt
57224 ./foo/bar2.txt
3525 ./foo/bar3.txt
18952 ./foo/bar4.txt
uj5u.com熱心網友回復:
是的。變數擴展是在該行被接受之后但在它被執行之前執行的。這意味著最終被執行的命令是
'/usr/bin/find' '.' '-type' 'f' '-name' '*.txt' '-exec' 'echo' '28855 {}' ';'
解決這個問題的兩種基本方法:
使用另一個
bash會延遲執行的:find . -type f -name \*.txt -exec bash -c 'echo "$RANDOM {}"' \;使用回圈:
for file in $(find . -type f -name \*.txt -print) do echo "$RANDOM $file" done如果你的檔案有空格,你必須做一些不同的事情來保留它們:
mapfile -d '' files < <(find . -type f -name \*.txt -print0) for file in "${files[@]}" do echo "$RANDOM $file" done
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422204.html
標籤:
