find + -printf +ソートの競合は発生しますか?

find + -printf +ソートの競合は発生しますか?

接続のために引用されたFLACファイル名のソートされたリストをSoXに渡す必要がありますが、期待どおりにソートするのに問題があります。

私が使用している場合:

find . -maxdepth 1 -type f -iname "*.flac" | sort

私が得たのは、まさに私が期待したものです。

./01-Lordy.flac
./02-Both Sides Now.flac
./03-Solitary Man.flac
./04-Holly Holy.flac
./05-Cherry Cherry.flac
./06-Kentucky Woman.flac
./07-Sweet Caroline.flac
./08-Thank the Lord for the Nightime.flac
./09-And the Singer Sings His Song.flac
./10-Brother Loves Traveling Salvation Show.flac

しかし、私は改行なしで引用されたリストが必要なので、私がやっていることにそれを実際に使用することはできません。 -printfが私のためにこれを行うことができることを知っていますが、試してみると次のようになります。

find . -maxdepth 1 -type f -iname "*.FlAc" -printf "\"%p\" " | sort

引用符で囲まれ、スペースで区切られたファイル名のリストが表示されますが(良い!)、ソートされません(悪い!)。または、少なくとも私が期待どおりに並べられていません。

"./08-Thank the Lord for the Nightime.flac" "./03-Solitary Man.flac" "./09-And the Singer Sings His Song.flac" "./05-Cherry Cherry.flac" "./06-Kentucky Woman.flac" "./10-Brother Loves Traveling Salvation Show.flac" "./07-Sweet Caroline.flac" "./02-Both Sides Now.flac" "./01-Lordy.flac" "./04-Holly Holy.flac"

おそらくもっと見知らぬのは、同じコードを使用しますが、テストのために改行を追加する場合です。

find . -maxdepth 1 -type f -iname "*.FlAc" -printf "\"%p\" "\\n | sort

出力がもはや必要ではなくても、ソートは引き続き機能します。

"./01-Lordy.flac" 
"./02-Both Sides Now.flac" 
"./03-Solitary Man.flac" 
"./04-Holly Holy.flac" 
"./05-Cherry Cherry.flac" 
"./06-Kentucky Woman.flac" 
"./07-Sweet Caroline.flac" 
"./08-Thank the Lord for the Nightime.flac" 
"./09-And the Singer Sings His Song.flac" 
"./10-Brother Loves Traveling Salvation Show.flac"

これはUbuntu 18.04.1にあります。

ベストアンサー1

soxファイルがすべて同じディレクトリにあり、並べ替えられたファイル名のリストを bash シェルに渡すには、次のように直接実行できます。

shopt -s nocaseglob
sox *.flac

シェルnocaseglobオプションを使用すると、foo.FLAC、foo.Flac、foo.flaCなどのワイルドカードを選択できます。ワイルドカードは、nakedのようにアルファベット順にソートされたリストに展開されますsort。たとえば。9-file.flacで始まるファイル名の後に配置されます8

上記のbash-ismをすべてのシェルで動作するワイルドカードで簡素化した@mosvyに感謝します。

sox *.[Ff][Ll][Aa][Cc]

角かっこを使用すると、「flac」拡張子を大文字と小文字の組み合わせで実行しているfind ... -iname "*.FlAc"操作と一致させることができます。

おすすめ記事