無邪気な努力をしています。
$ cat * | sort -u > /tmp/bla.txt
失敗:
-bash: /bin/cat: Argument list too long
したがって、(巨大な一時ファイルの生成)などの愚かな解決策を避けるには、次のようにします。
$ find . -type f -exec cat {} >> /tmp/unsorted.txt \;
$ cat /tmp/unsorted.txt | sort -u > /tmp/bla.txt
次のようにファイルを1つずつ処理できます(これにより、メモリ消費量が減り、ストリーミングメカニズムに近づきます)。
$ cat proc.sh
#!/bin/sh
old=/tmp/old.txt
tmp=/tmp/tmp.txt
cat $old "$1" | sort -u > $tmp
mv $tmp $old
以下は次のとおりです。
$ touch /tmp/old.txt
$ find . -type f -exec /tmp/proc.sh {} \;
もっとシンプルでUnixスタイルの代替案はありますか?cat * | sort -u
ファイル数に達したときMAX_ARG
?これらの一般的な操作のために小さなシェルスクリプトを書くのは厄介です。
ベストアンサー1
少なくともBashでは動作する簡単な修正です。printf
組み込みであり、コマンドライン引数制限が適用されないためです。
printf "%s\0" * | xargs -0 cat | sort -u > /tmp/bla.txt
(echo * | xargs
スペースなどを含むファイル名を処理する以外は機能します。)