我如何在每个子目录中搜索 3 个唯一文件,并在所有 3 个文件都存在时列出该子目录?然后根据前 7 个字符查找唯一的子目录

我如何在每个子目录中搜索 3 个唯一文件,并在所有 3 个文件都存在时列出该子目录?然后根据前 7 个字符查找唯一的子目录

我有一个目录,其内容如下例所示。我想搜索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/

相关内容