进入几个目录并执行一些操作,排除目录名称中带有特定字符串的少数目录



我有100个目录,它们的名称中有" this ", " that "或" nope "。例子:

。/abc_3737_this_123。/abc_9879_this_456。/abc_2696_that_478。/abc_8628_nope_958。/abc_9152_nope_058

我想进入这些dir/子目录排除dir他们的名字包含"不"。我只是希望代码只留下带有"nope"的目录;不能进入目录,不能检查子目录

当前我在所有目录中使用这个:

for dir in abc*;做(某事);做

我想要这样的:

for dir in (abcthis&&abc);做(某事);做

我很抱歉这很傻,我是很新的脚本。谢谢你的宝贵时间。

嗯,你有很多选择。你的外壳是什么?如果使用bash,可以使用shopt -s extglob,然后执行以下操作:

for dir in abc_*_@(this|that)_*; do

包含,或

for dir in abc_*_!(nope)_*; do

是排他的

如果您使用zsh,您可以使用setopt kshglob来使上述工作,或者使用setopt extendedglob和这些代替:

for dir in abc_*_(this|that)_*; do

for dir in abc_*_^nope_*; do

您也可以使用find,但是您必须使用它来构建一个循环列表,或者将循环体转换为单个命令,您可以将其传递给findxargs以执行。

find . -maxdepth 1 ( ( -not -name *nope* ) -or -prune ) -print0 | xargs -r -0 do_something
while IFS= read -r dir; do 
echo "$dir"
done < <(find ./*this* ./*that* -maxdepth 0 -type d)
# or < <(find . -maxdepth 1 -type d |grep -E '.*this.*|.*this.*')
# Example
$ while IFS= read -r dir; do echo " -  $dir"; done < <(find /*m*e* /*oo* -maxdepth 0 -type d)
-  /home
-  /media
-  /boot
-  /root

相关内容

  • 没有找到相关文章

最新更新