Find
find :處理一個目錄並將結果寫入找到的目錄
我想找到一個目錄,對它應用一個命令,結果應該通過管道傳送到這個找到的目錄中。
假設
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
不是符號連結等。 )