GNU sort、およびprintfが組み込まれているシェル(一部のバリアントを除いて、今日ではすべてのPOSIXのようなものpdksh):
printf '%s\0' * | sort -u --files0-from=- > output
ここでの問題は、そのパイプラインの2つのコンポーネントが同時に独立して実行されるため、左側のコンポーネントが*グロブを展開するときまでに、右側のコンポーネントがoutputファイルをすでに作成していて、問題が発生している可能性があることです(-uここにはないかもしれません)。outputあなたが(別のディレクトリに出力行くを持っているしたい場合ので、入力と出力ファイルの両方になります> ../output例えば)、または確認グロブは、出力ファイルと一致していませんします。
このインスタンスでそれに対処する別の方法は、それを書くことです:
printf '%s\0' * | sort -u --files0-from=- -o output
このようにして、それは書き込み用にsort開いoutputており、(私のテストでは)ファイルの完全なリストを受け取るまでは(グロブが展開された後は)それを行いません。またoutput、入力ファイルがどれも読み取り可能でない場合は、破壊を回避します。
zshまたはでそれを書く別の方法bash
sort -u --files0-from=<(printf '%s\0' *) -o output
これは、プロセス置換を使用しています(ここで、<(...)は、パイプの読み取り側printfが書き込む先のファイルパスに置き換えられます)。その機能は、から来ているkshが、ksh拡大することに主張<(...)あなたがそれを使用することはできませんので、コマンドに別の引数を--option=<(...)構文。ただし、この構文で機能します。
sort -u --files0-from <(printf '%s\0' *) -o output
cat改行文字で終わっていないファイルがある場合に、ファイルの出力をフィードするアプローチとは異なることに注意してください。
$ printf a > a
$ printf b > b
$ printf '%s\0' a b | sort -u --files0-from=-
a
b
$ printf '%s\0' a b | xargs -r0 cat | sort -u
ab
sortは、ロケール(strcollate())の照合アルゴリズムを使用してソートし、sort -uバイトレベルの一意の行ではなく、そのアルゴリズムで同じようにソートする各行セットの1つを報告することにも注意してください。行がバイトレベルで一意であることにのみ関心があり、並べ替えられている順序にそれほど関心がない場合は、並べ替えがバイト値に基づいているCにロケールを修正することができます(memcmp();これはおそらく高速になるでしょう)大幅にアップ):
printf '%s\0' * | LC_ALL=C sort -u --files0-from=- -o output
sort複数のファイル入力に対してそれを自動的に行いますが、それからsort -u *失敗するとArgument list too long思います