我有一个目录,其内容如下例所示。我想搜索subdir1, subdir2 & subdir3
文件testA/*a.txt, testB/*b.txt & testC/*c.txt
。我想要一个仅包含所有 3 个子目录的列表。
在此示例中,只有subdir1
& subdir2
。
subdir1/
subdir1/testA/
subdir1/testA/subdir1-a.txt
subdir1/testB/
subdir1/testB/subdir1-b.txt
subdir1/testC/
subdir1/testC/subdir1-c.txt
subdir2/
subdir2/testA
subdir2/testA/subdir2-a.txt
subdir2/testB
subdir2/testB/subdir2-b.txt
subdir2/testC/
subdir2/testC/subdir2-c.txt
subdir3/
subdir3/testA
subdir3/testA/subdir3-a.txt
subdir3/testB
subdir3/testB/subdir3-b.txt
subdir3/testC/
subdir3/testZ
subdir3/testZ/subdir3-z.txt
然后我想按字母顺序获得输出,例如:
subdir1
subdir2
...然后只获得独特的
(之所以存在这种需要,是因为我find
目前正在使用,并且目录未按顺序列出。子目录也有更长/更复杂的名称。)
我怎样才能做到这一点?
我已经列出了一种类型的文件,例如文件*-a.txt
,如下所示:
find . -wholename "**/testA/*a.txt
很抱歉,如果答案已经存在于某个地方,我看了但找不到。任何建议将不胜感激。
答案1
像这样的事情怎么样:
$ shopt -s nullglob
$ for dir in */; do
f1=( "$dir"/testA/*a.txt )
f2=( "$dir"/testB/*b.txt )
f3=( "$dir"/testC/*c.txt )
if [[ "${#f1[@]}" -gt 0 && "${#f2[@]}" -gt 0 && "${#f3[@]}" -gt 0 ]]; then
printf '%s\n' "$dir"
fi
done
subdir1/
subdir2/
首先,打开 bash 的nullglob
选项以确保不匹配任何文件的 glob 扩展为空字符串。接下来,迭代当前目录中的所有子目录,并且对于每个子目录,将相应的 glob 扩展结果保存到数组中。然后,如果所有三个数组都至少有一个元素,则打印子目录的名称。
你也可以做同样的基本事情find
:
$ for dir in */; do
if [[ $(find "$dir" -wholename "*/testA/*a.txt" | wc -l) -gt 0 &&
$(find "$dir" -wholename "*/testB/*b.txt" | wc -l) -gt 0 &&
$(find "$dir" -wholename "*/testC/*c.txt" | wc -l) -gt 0 ]]; then
printf '%s\n' "$dir"
fi
done
subdir1/
subdir2/