我有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
,但是您必须使用它来构建一个循环列表,或者将循环体转换为单个命令,您可以将其传递给find
或xargs
以执行。
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