Find

將 glob 轉換為find

  • September 6, 2021

我一次又一次遇到這個問題:我有一個 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。我不確定這到底是在哪裡記錄的。


Vimglob2regpat()和 Pythonfnmatch.translate()都可以將 glob 轉換為正則表達式,但都可以使用.*for *,匹配 cross /

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