Find將 glob 轉換為
將 glob 轉換為find
我一次又一次遇到這個問題:我有一個 glob,它與正確的文件完全匹配,但導致
Command line too long
. 每次我都將它轉換為適用於特定情況的find
和的某種組合grep
,但它不是 100% 等效的。例如:
./foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg
是否有將 glob 轉換為
find
我不知道的表達式的工具?或者是否有一個選項find
可以匹配全域而不匹配子目錄中的相同全域(例如foo/*.jpg
,不允許匹配bar/foo/*.jpg
)?
如果問題是您收到參數列表太長錯誤,請使用循環或內置 shell。雖然
command glob-that-matches-too-much
可以出錯,for f in glob-that-matches-too-much
但不會,所以你可以這樣做:for f in foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg do something "$f" done
循環可能非常緩慢,但它應該可以工作。
或者:
printf "%s\0" foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg | xargs -r0 something
(
printf
在大多數 shell 中內置,上面的工作圍繞execve()
系統呼叫的限制)$ cat /usr/share/**/* > /dev/null zsh: argument list too long: cat $ printf "%s\n" /usr/share/**/* | wc -l 165606
也適用於 bash。我不確定這到底是在哪裡記錄的。
Vim
glob2regpat()
和 Pythonfnmatch.translate()
都可以將 glob 轉換為正則表達式,但都可以使用.*
for*
,匹配 cross/
。