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'
ここでは、ディレクトリ名であるパスの先頭を%h
提供します。h
LC_ALL=C
*
ユーザーのロケールに関係なく、すべてのバイトシーケンスと一致する必要があります。数値、ファイルパスは、必ずしもユーザーロケールの文字ではなく、ゼロ以外のすべてのバイトシーケンスで構成できるためです。
ソートされたリスト(非表示リストを除く)を提供するのと同様に、次のものを含むディレクトリに表示し、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
隠しファイル(またはファイル)を含める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
また見なさい: