2013-01-23 6 views
5

bashで "find"コマンドを実行した結果に基づいてディレクトリの一覧があります。一例として、検索の結果はファイルです:bashでfindの結果(ネストされたディレクトリを含む)をアルファベット順に並べ替える方法

test/a/file 
test/b/file 
test/file 
test/z/file 

私はそれのように表示されるように、出力をソートしたい:

test/file 
test/a/file 
test/b/file 
test/z/file 

findコマンドの中に結果をソートする方法はあります、または結果をソートにパイプすることによって?

答えて

9

あなたが検索のGNUバージョンを持っている場合は、これを試してみてください。

find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}' 

は、ループ内でこれらのファイル名を使用するには、各ファイルの

find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F '\0' '{print $3}' | while read file; do 
    # use $file 
done 

findコマンドを印刷3つのことを実行します。 (1)そのディレクトリ、(2)ディレクトリツリーの深さ、および(3)そのフルネーム。出力に深度を含めることにより、test/filetest/a/fileよりも上にソートするのにsort -nを使用することができます。最後に、awkを使用して、最初の2つの列は並べ替えにのみ使用されていたため、取り除きます。

\0を3つのフィールドの間の区切り記号として使用すると、ファイル名にスペースとタブを使用できます(ただし、残念ながら改行はできません)。

$ find test -type f 
test/b/file 
test/a/file 
test/file 
test/z/file 
$ find test -type f -printf '%h\0%d\0%p\n' | sort -t '\0' -n | awk -F'\0' '{print $3}' 
test/file 
test/a/file 
test/b/file 
test/z/file 

あなたがfindコマンドを変更することができない場合は、この複雑置き換えてみてください:ファイルのディレクトリ名を取得するために使用されて${file%/*}

find test -type f | while read file; do 
    printf '%s\0%s\0%s\n' "${file%/*}" "$(tr -dc/<<< "$file")" "$file" 
done | sort -t '\0' | awk -F'\0' '{print $3}' 

それは同じことを行い、そしてtrコマンドをファイルの「深さ」に相当するスラッシュの数を数えます。

(私は必ず何を求めていることは難しいが、私は簡単な解決策にブランキングしていますことを思えません。そこに簡単に答えがあります願っています。)

+1

私はこのコマンドをbashスクリプトの一部として使用しています。私は、次の行に沿って何かできることを望んでいました。 'for find in file ... |ソート... ' – Ken

+0

@Ken私の編集を参照してください。 'find ... | read fileは 'for $(find ...)'のファイルよりも優先されるべきです。後者は空白には安全でなく、遅くなり、コマンドラインに収まるファイル名が多すぎるとエラーになります。 –

-1

これを試してみてください。参照のために、最初に2番目のフィールドの2番目のcharにソートします。これはファイル上にのみ存在し、最初に逆の意味を持つrを持ち、その後に2番目のフィールドの最初の文字をソートします。 [-tは-kが鍵であり、フィールドdeliminatorある]

find test -name file |sort -t'/' -k2.2r -k2.1 

詳細はinfo sortを行います。異なる結果を得るために、-tと-kを一緒に使用するには、さまざまな方法があります。

+0

これは、サンプルのファイル名を並べ替えるための奇妙な方法です。それは一般的な解決策ではありません。 –

関連する問題