列出带有一些命名转换的子目录

列出带有一些命名转换的子目录

我想编写一个脚本,该脚本将在我的子目录上运行某些命令,其名称包含或以某些字符串结尾,例如,*-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

我能想到的两件事

  1. 将三个find调用合并为一个

    find -maxdepth 2 -type d \( -name '*-nom1' -o -name '*-nom2' -o -name '*-nom3' \)
    
  2. 利用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 '{}' ...
\;

相关内容