• 締切済み

【Linux】findコマンドの表示順

linuxのfindコマンドについて質問です。 例えば、あるディレクトリの構成が以下の通りだったとします。 /dir1/aaa.txt /dir1/zzz.txt /dir1/dir2/bbb.txt このとき、 find *.txt | sort を行うと /dir1/aaa.txt /dir1/dir2/bbb.txt /dir1/zzz.txt という順に表示されます。 (文字としてはソートされていますが、ディレクトリ構造としては滅茶苦茶です。) しかし、ファイル名を表示する際は通常はディレクトリ毎に表示したいため、 1つ目の例の順のように表示される必要があります。 このとき、どのようにすればfindによる検索結果を1つ目のようにディレクトリ順に表示できるのでしょうか。 実際はディレクトリ構成が複雑で、ファイルもディレクトリも非常に多くあります。

みんなの回答

  • gfe01045
  • ベストアンサー率61% (19/31)
回答No.5

きゅうきょ作成したので、自信がありませんが、 for f in `find . -type d` do find $f -maxdepth 1 -mindepth 1 -name "*.txt" | sort done では...

  • 8ive22ty
  • ベストアンサー率52% (770/1479)
回答No.4

find結果の文字列は、単なる文字列ですのでディレクトリ構造を持っていません。 したがって、得られた文字列から「/」をデリミッタ文字として「/」の出現回数を計算して、この回数をsortパラメータに含ませればいいでしょう。 つまり、findやsortなどのコマンドだけではムリでしょう。 > このとき、find *.txt | sort を行うと・・・。 これではサブディレクトリまで検出できないのでは?。 カレントディレクトリをfindでサブディレクトリまで検索するには下記のようになるのではありませんか? ただし、下記の結果は単なる文字列sortです。 find -D tree | grep .txt | sort

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

同じ階層のファイルを先にディレクトリを後にしたいと言うことですか? find *.txt と書かれてますが、これは、find -name "*.txt" の間違いですよね。 ディレクトリ名の前にソート順が遅くなるように ~~ とかをつけて、 find -name "*.txt" | sed -e 's:/:/~~:g' -e 's:/~~\([^/]*\)$:/\1:' | sort | sed 's:/~~:/: ~~で始まるファイル名がそもそもあるなら修正が必要です。

noname#155138
質問者

補足

ありがとうございます。これで希望の処理ができました。 調べながら意味を解読していますが、ここで使用されているコロンにはどういう意味があるのでしょうか。 通常の置換では s/aaa/bbb/g のような記法になると思いますが、コロンが入ることによって何が起こっているのでしょうか?

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

#1です。 書き忘れてましたが、 find *.txt のような使い方のfindはlinuxにはなかったと思いますが。 / を基準にして *.txt にマッチするファイルのパスを出力するなら find / -name '*.txt' -print になります。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

そのような出力順で出力したいのでしたら、ご自分でそのプログラムを作るしかないと思いますよ。 例にあげられてるディレクトリ構成は、あなた好みの出力順でしかなく、その好みを理解してソートしてくれるようなプログラムはありませんから。

関連するQ&A