我想编写一个脚本,该脚本将在我的子目录上运行某些命令,其名称包含或以某些字符串结尾,例如,*-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' \)
利用
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 {} +
答案2
您可以将测试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 -名称”-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 '{}' ...
\;