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
思います