我想找到所有已命名的目录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
也可以看看: