Bash

列出帶有一些命名轉換的子目錄

  • November 28, 2016

我想編寫一個腳本,該腳本將在我的子目錄上執行某些命令,其名稱包含或以某些字元串結尾,例如*-nom1, *-nom2, *-nom3。IE

for 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如果有幫助,我的腳本將繼續執行。

我能想到的兩件事

  1. 將三個find呼叫合二為一
find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \)
  1. 使用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 '{}' ...
\;

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