あなたが検索の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/file
をtest/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
コマンドをファイルの「深さ」に相当するスラッシュの数を数えます。
(私は必ず何を求めていることは難しいが、私は簡単な解決策にブランキングしていますことを思えません。そこに簡単に答えがあります願っています。)
私はこのコマンドをbashスクリプトの一部として使用しています。私は、次の行に沿って何かできることを望んでいました。 'for find in file ... |ソート... ' – Ken
@Ken私の編集を参照してください。 'find ... | read fileは 'for $(find ...)'のファイルよりも優先されるべきです。後者は空白には安全でなく、遅くなり、コマンドラインに収まるファイル名が多すぎるとエラーになります。 –