「検索」結果をアルファベット順と位相順にソートする方法は?

「検索」結果をアルファベット順と位相順にソートする方法は?

次のようなレイアウトのファイルがあるとしましょう。

$ tree
.
├── 01/
│   ├── example.txt
│   └── foobar.txt
├── 02/
│   └── example.txt
└── 03/
    ├── example.txt
    └── test.txt

3 directories, 5 files

find .ディレクトリとファイルをトポロジ順(つまり、ディレクトリ名が内容の前に置かれる)と同じディレクトリ内でアルファベット順に印刷したいと思います。代わりに私が得た結果は次のとおりです。

$ find .
.
./02
./02/example.txt
./01
./01/foobar.txt
./01/example.txt
./03
./03/test.txt
./03/example.txt

出力が次のようになります。

.
./01
./01/foobar.txt
./01/example.txt
./02
./02/example.txt
./03
./03/example.txt
./03/test.txt

コマンドが完了する前に行を順番に処理しsortたいので、他のコマンドにパイプしたくありません。find

答え1

あなたはそうすることはできません。

特定の順序でファイルを処理するには、処理を開始する前にその順序でファイルを並べ替える必要があります。

findファイルシステムで任意の順序でファイル/ディレクトリを検索します(しばしば「ディレクトリ順序」と呼ばれ、多くのファイルシステムでは主に作成日に影響されますが、ファイル/ディレクトリが削除されるとその場所が再利用される可能性があるため、基本的に次のようになります。仮定する必要があります)。ランダム)、あなたの場合はアルファベット順ではないようです。しかし、アルファベット順で最初に、おそらくファイルシステムで最後になるでしょう。したがって、ファイルをアルファベット順に処理するには、ディレクトリ全体を読み取る必要があります。

必要なものに最も近い結果を得るには、いくつかのコーディングを実行する必要があるかもしれません。検索の最上位ディレクトリを検索している場合は、「01」ディレクトリを次に検索し、次に「02」、...を検索すると同時に「02」(およびそれ以降のディレクトリ)を検索しながら「01」処理を開始できます。 。 (ディレクトリ構造がより一般的な場合は、適切に一般化してください。)

答え2

GNU find、、、sortおよびxargs

find . -print0 | sort -z | xargs -0r process_the_files

process_the_files-exec検索オプションを使用して実行するプログラムまたはスクリプト。

これはパイプライン(-print0、-z、および-0オプション)全体でファイル名の区切り文字としてNULを使用するため、有効な文字(スペース、タブ、改行などを含む)を含むファイル名を使用するのは安全です。

findによって生成されたファイル名のリスト(そのファイルの内容ではない)を処理するには、次のようにします。

  1. process_the_files上記の内容をそのまま使用し、そのファイルの内容ではなくファイル名パラメータを繰り返すようにスクリプトを作成します。process_the_filesファイル名のリストが大きすぎてコマンドラインに入ることができない場合は、xargsを複数回実行できます(これはオペレーティングシステムによって異なり、Linuxでは約2MBです)。

    ただし、find ... -exec ... {} +同じ方法でシステムのコマンドラインの長さによって制限されます。

  2. パイプの適切な部分をスキップし、整列xargsした出力を目的のタスクにパイプします。〜しなければならないNULで区切られた入力を扱うことができます(ほとんどのGNUツールは可能であり、awkやperlで直接書くのは簡単です。 . 区切り文字) 。これはコマンドラインの長さによって制限されません。標準入力からのファイル名の数に関係なく処理できます。

関連情報