Bash
列出帶有一些命名轉換的子目錄
我想編寫一個腳本,該腳本將在我的子目錄上執行某些命令,其名稱包含或以某些字元串結尾,例如
*-nom1
,*-nom2
,*-nom3
。IEfor dir in $(subs) do // do something in this dir done
我的問題是,這是否是列出我的子目錄的方法,如果不是最好的方法是什麼:
subs = find -maxdepth 2 -type d -name '*-nom1' && find -maxdepth 2 -type d -name '*-nom2' && find -maxdepth 2 -type d -name '*-nom3'
我可以在我的
Ubuntu
終端上測試它,它似乎工作。
Debian
如果有幫助,我的腳本將繼續執行。
我能想到的兩件事
- 將三個
find
呼叫合二為一find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \)
- 使用
find
的執行命令的能力來避免外部for
循環find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \) \ -exec sh -c 'for d; do cd "$d"; cmd1; cmd2; cmd3; ...; done' sh {} +
您可以將測試
find
與-o
代表“或”結合起來;測試之間的隱式運算符是“and”。例如:subs="$(find -maxdepth 2 -type d \( \ -name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \ \) )" for d in $subs ; do ... do something with "$d" ... done
`-name " -nom1" -o -name “ -nom2” -o “*-nom3” 周圍的括號需要被引用,因為它們是 shell 的保留字。
現在,正如 don_crissti 在評論中所說,一般建議是避免擷取 的輸出
find
,原因有兩個;首先,因為文件名可能包含空格、換行符和特殊字元等等;其次,因為find
從本質上講,結果是循環的。更好的習慣用法是在 ; 中使用隱式循環find
。請參閱為什麼循環查找的輸出不好的做法和相關討論:find -maxdepth 2 -type d \( \ -name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \ \) -exec \ ... do something with '{}' ... \;