Find

find :處理一個目錄並將結果寫入找到的目錄

  • August 30, 2021

我想找到一個目錄,對它應用一個命令,結果應該通過管道傳送到這個找到的目錄中。

假設find -type d給出

.
./cortexa53-crypto-mx8mp
./cortexa53-crypto
./imx8mp_sp
./all

我考慮做這樣的事情:

find -type d -exec '~/bin/opkg-utils/opkg-make-index {} | gzip > {}/package.gz'  \;

結果例如:

find: '~/bin/opkg-utils/opkg-make-index ./cortexa53-crypto-mx8mp | gzip > ./cortexa53-crypto-mx8mp/package.gz': No such file or directory

但是,如果我執行該命令(那麼裡面是什麼' ')-它可以工作!?!?

額外的問題:如何避免找到.

如果您需要執行比帶有 from 參數的簡單命令更複雜的東西-exec,請在一個內聯腳本中執行此操作:

find . -type d -exec sh -c '
   tmpfile=$(mktemp) || exit
   trap "rm -f \"\$tmpfile\"" EXIT

   for dirpath do
       "$HOME"/bin/opkg-utils/opkg-make-index "$dirpath" | gzip -c >"$tmpfile" &&
       cp -- "$tmpfile" "$dirpath"/package.gz
   done' sh {} +

這會將成批的目錄路徑作為參數傳遞給內聯sh -c腳本。這個簡短的腳本循環遍歷這些路徑,並為每個路徑呼叫您的實用程序並將壓縮輸出寫入臨時文件。寫入文件後,將其移動到目錄中,然後循環繼續下一個目錄。

請注意,這將遞歸到子目錄中。

為了避免找到.使用! -path .

find . ! -path . -type d -exec sh -c '...' sh {} +

或者,使用 GNU find(和其他一些),使用-mindepth 1

find . -mindepth 1 -type d -exec sh -c '...' sh {} +

為避免遞歸到子目錄,-prune請在找到目錄後立即使用:

find . ! -path . -type d -prune -exec sh -c '...' sh {} +

或者,使用 GNU find,使用-maxdepth 1

find . -mindepth 1 -maxdepth 1 -type d -exec sh -c '...' sh {} +

但是如果你只對單個目錄感興趣,沒有遞歸,那麼你可以只使用一個 shell 循環:

shopt -s nullglob dotglob

tmpfile=$(mktemp) || exit
trap 'rm -f "$tmpfile"' EXIT

for dirpath in */; do
   dirpath=${dirpath%/}
   [ -h "$dirpath" ] && continue

   "$HOME"/bin/opkg-utils/opkg-make-index "$dirpath" | gzip -c >"$tmpfile" &&
   cp -- "$tmpfile" "$dirpath"/package.gz
done

這本質上與執行的內聯腳本中的循環相同find,但它是一個bash腳本,它確實需要執行一些find原本會執行的工作(啟用通配隱藏名稱,檢查它$dirpath不是符號連結等。 )

引用自:https://unix.stackexchange.com/questions/666469