查找具有名称的目录,但如果其中包含特定的顶级文件,则对其进行过滤

查找具有名称的目录,但如果其中包含特定的顶级文件,则对其进行过滤

我想找到所有已命名的目录Contents,然后从找到的结果列表中过滤它们,并仅包含那些Database.json在其中直接命名的文件的目录。

find / -type d -name Contents 2>/dev/null |
while read dir;
do
    if [ -f $dir/Database.json ]; then
        echo $dir
    fi
done

这段代码有效。但我认为这太过分了。我认为应该有一种更简单的方法来做到这一点。

我可以重写这段代码使其变得更简单吗?

答案1

使用 GNU find,您可以执行以下操作:

LC_ALL=C find . -path '*/Contents/Database.json' -printf '%h\n'

where%h为您提供h路径的开头,即目录名。

LC_ALL=C需要*匹配任何字节序列,无论用户的区域设置如何人物,因为文件路径可以由 0 以外的任何字节序列组成,而不必组成用户区域设置中的字符。

与 类似zsh,也为您提供一个排序列表(不包括隐藏的列表),还添加报告符号链接到包含以下内容的目录Database.json

print -rC1 -- **/Contents/Database.json(N:h)

对于更接近 GNUfind的方法:

print -rC1 -- **/Contents(NDoN/e['
  [[ -e $REPLY/Database.json || -L $REPLY/Database.json ]]'])

在哪里:

  • D包括隐藏文件(Dot 文件)
  • oNN订购o列表。
  • /选择目录类型的文件。
  • e['code']检查目录是否包含Database.json任何类型的文件,包括损坏的符号L墨水。

无论如何,你无法像您那样对列表进行后处理。相反,你会这样做:

对于 GNUfindzshbash

while IFS= read -ru3 -d '' file; do
  something with "$file"
done 3< <(LC_ALL=C find . -path '*/Contents/Database.json' -printf '%h\0')

zsh

for file (**/Contents/Database.json(N:h)) something with $file

也可以看看:

相关内容