コマンドのデフォルトのソート順を見つける


30

linux findコマンドによって返されるエントリのデフォルトのソート順は何ですか?

たとえば、私が発行する場合

find . -type f -name '*mp3' 

また、出力は複数のサブフォルダーにまたがる複数のファイルで構成されていますが、ディレクトリーがリストされるデフォルトの順序は何ですか?同時に、個々のディレクトリ内のファイルがリストされるソート順は何ですか?

時々それは戻ります:

./B/01.mp3
./A/01.mp3
./A/04.mp3
./A/02.mp3

最初にディレクトリBのコンテンツがリストされ、次にディレクトリAのコンテンツがどのようにリストされるかを確認してください。同時にディレクトリA内では、ファイルが面白い順序でリストされます。


経験から、インストールごとに一貫しているようです。2つのマシンに同じファイルのセットがある場合、常に1つのマシンで1つのオーダーを返し、もう1つのマシンでまったく異なるオーダーを返します。以前、なぜ+1
ジェームスL

1
車にFMトランスミッターがあり、フラッシュカードの曲をいつもと違う順序で再生します。私はそれを理解していませんでしたが、上記のコマンドが出力を返すのとまったく同じ順序であることを認識しました
Nasko

BTW:BSD findには、-s出力をアルファベット順にソートするパラメーターがあります。
lapo

回答:


19

findディレクトリエントリ内にアイテムが格納される順序でディレクトリツリーを走査します。これは(ほとんど)実行から実行まで同じマシン上で一貫しており、削除がなければ基本的に「ファイル/ディレクトリの作成順序」になります。

ただし、一部のファイルシステムでは、圧縮操作の一部として、またはエントリのサイズを拡張する必要があるときにディレクトリエントリの順序が変更されるため、「生の」順序が時間とともに変わる可能性は常にわずかです。一貫した順序が必要な場合は、追加のソートステージを介して出力をフィードします。


詳細な回答をありがとう!そのため、FMトランスミッター(前のコメントを参照)が、findコマンドがリストする順序でトラックを再生する場合、再生する順序を制御できません。
ナスコ

フラッシュカードはおそらくFATファイルシステムを使用しているので、覚えていれば、FATエントリの順序を操作するのはファイルシステムデバッガーで簡単です。おそらく、現在のフラッシュから新しいフラッシュに曲をコピーする価値があります。再生したい順序で、それは簡単かもしれません。
バティーン

そのような一貫性の有用なアプリケーションの1つは、最初にファイルのソートされたリストを取得するためにfind /path/ -exec ...はるかに高速で実行される低速の進捗推定find /path/です。
アンドレイ


2

私はそれぞれ1984/1991年からUNIX / Linuxで作業しており、最初に教えられたコマンドはfindでした。Linux / GNUは、必要なほとんどすべてを現在のfindコマンドに入れているので、試してみてください。

検索出力をソートするための役立つヒントを次に示します。-printfオプションには、より複雑なソートとファイル情報の表示を可能にする多くのオプションがあります。このような問題には最適です。それを試して、何があなたのために働くかを見てください。-printfを使用すると、希望する方法で結果をカスタマイズおよび区切ることができます。これは、結果を後処理する必要がある場合に非常に役立ちます。これが誰かの助けになることを願っています。

  1. -lsを使用し、ファイル名でソートする場合、11番目のフィールドはファイル名であるため、以下を実行できます。sort -kオプションでは、複数のフィールドを使用してソートすることもできます。

    / path -lsを見つける| ソート-k11

  2. 昇順または降順で日付/時刻でより細かく制御する場合は、-printf ""オプションを使用します。詳細はマニュアルを参照してください。ただし、次の例は秒の小数部で印刷されるため、非常に正確です。

日時の例:2016-09-17 + 12:09:57.9013929800

find /path -printf "%T+ %p\n" | sort -n # Ascending

find /path -printf "%T+ %p\n" | sort -nr # Descending

日付/時刻文字列の文字なしでこれを行う別の方法は次のとおりです。

日付/時刻の例:20160917120013.8101685040

find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.