![查找具有名称的目录,但如果其中包含特定的顶级文件,则对其进行过滤](https://linux22.com/image/207865/%E6%9F%A5%E6%89%BE%E5%85%B7%E6%9C%89%E5%90%8D%E7%A7%B0%E7%9A%84%E7%9B%AE%E5%BD%95%EF%BC%8C%E4%BD%86%E5%A6%82%E6%9E%9C%E5%85%B6%E4%B8%AD%E5%8C%85%E5%90%AB%E7%89%B9%E5%AE%9A%E7%9A%84%E9%A1%B6%E7%BA%A7%E6%96%87%E4%BB%B6%EF%BC%8C%E5%88%99%E5%AF%B9%E5%85%B6%E8%BF%9B%E8%A1%8C%E8%BF%87%E6%BB%A4.png)
我想找到所有已命名的目录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
包括隐藏文件(D
ot 文件)oN
不N
订购o
列表。/
选择目录类型的文件。e['code']
检查目录是否包含Database.json
任何类型的文件,包括损坏的符号L
墨水。
无论如何,你无法像您那样对列表进行后处理。相反,你会这样做:
对于 GNUfind
和zsh
或bash
:
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
也可以看看: