プロが教えるわが家の防犯対策術!

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つ目のようにディレクトリ順に表示できるのでしょうか。
実際はディレクトリ構成が複雑で、ファイルもディレクトリも非常に多くあります。

A 回答 (5件)

きゅうきょ作成したので、自信がありませんが、



for f in `find . -type d`
do
find $f -maxdepth 1 -mindepth 1 -name "*.txt" | sort
done

では...
    • good
    • 0

find結果の文字列は、単なる文字列ですのでディレクトリ構造を持っていません。


したがって、得られた文字列から「/」をデリミッタ文字として「/」の出現回数を計算して、この回数をsortパラメータに含ませればいいでしょう。
つまり、findやsortなどのコマンドだけではムリでしょう。

> このとき、find *.txt | sort を行うと・・・。

これではサブディレクトリまで検出できないのでは?。
カレントディレクトリをfindでサブディレクトリまで検索するには下記のようになるのではありませんか?
ただし、下記の結果は単なる文字列sortです。
find -D tree | grep .txt | sort
    • good
    • 1

同じ階層のファイルを先にディレクトリを後にしたいと言うことですか?



find *.txt と書かれてますが、これは、find -name "*.txt" の間違いですよね。
ディレクトリ名の前にソート順が遅くなるように ~~ とかをつけて、

find -name "*.txt" | sed -e 's:/:/~~:g' -e 's:/~~\([^/]*\)$:/\1:' | sort | sed 's:/~~:/:

~~で始まるファイル名がそもそもあるなら修正が必要です。

この回答への補足

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

補足日時:2012/06/02 09:18
    • good
    • 1

#1です。


書き忘れてましたが、

find *.txt

のような使い方のfindはlinuxにはなかったと思いますが。
/ を基準にして *.txt にマッチするファイルのパスを出力するなら

find / -name '*.txt' -print

になります。
    • good
    • 0

そのような出力順で出力したいのでしたら、ご自分でそのプログラムを作るしかないと思いますよ。



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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています