名前のあるディレクトリを探し、特定の最上位ファイルが含まれている場合はフィルタリングします。

名前のあるディレクトリを探し、特定の最上位ファイルが含まれている場合はフィルタリングします。

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 ]]'])

どこ:

  • DD隠しファイル(またはファイル)を含める
  • oNN注文リストはありませんo
  • /ディレクトリタイプファイルを選択します。
  • e['code']ディレクトリにDatabase.json破損したシンボルインクを含む、どの種類のファイルが含まれているかを確認してくださいL

とにかくあなたはあなたのようにリストを後処理する方法はありません。代わりに、次の操作を行います。

GNUfindzshまたは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

また見なさい:

おすすめ記事