すべてのサブディレクトリのすべてのファイルをソートしたいと思います。 256個のディレクトリに65536個のファイルがあり、各ファイルには1行に1語が含まれ、各ファイルには重複エントリが含まれています。
私が望むのは、-uオプションを使用してこれらの項目をソートすることです(理由はわかりませんが、ソートをuniq -uコマンドに渡すと、実際に重複した一意の行が削除されるのに奇妙ですが、とにかく)。これにより、どの出力ファイルも望ましくありません。メモリ内のファイルを並べ替えて読み込み、上書きしたいと思います。 -o オプションを試しましたが、ファイル名が必要です。
これを再帰的に実行する方法はありますか?
ありがとうございます:)
ベストアンサー1
それは次のようになります:
find . -type f -size +1c -exec sort -uo {} {} ';'
(2バイト未満のファイルはここからスキップされます。2つの別々の行を作成するには、少なくとも3バイトが必要な場合、または空白行と無制限の行1が続く"\nx"
2バイトが必要になる可能性があるため)。
デフォルトのソート順序は、sort
ロケールのデータソートアルゴリズムに基づいています。
2行は、バイト単位が同じでなくても同じように並べ替えることができます。特に、行に有効な文字を形成しないバイトシーケンスが含まれており、GNUシステム(Debianなど)では、ソート順序が同じでない場合はさらにそうです。文字に対しても同じように定義されているようにソートされます。
あなたはできます:
LC_ALL=C find . -type f -exec sort -uo {} {} ';'
対照的に、ASCIIベースのシステム(たとえば、すべてのアーキテクチャとカーネルのDebian)では、Cロケールの照合はロケールソート順序ではなくバイト値に基づいています(またはIOW、Cロケールの照合はバイト値に基づいています) 。 )行は並べ替えられ、バイトが異なる2つの行が等しく並べられないようにする必要があります。
sort
これはファイルごとに1つの呼び出しを実行します。ファイルが非常に短い場合は、作業を高速化するために次のことを行うことができますzsh
。
zmodload zsh/mapfile
for f (**/*(N.)) print -rC1 -v 'mapfile[$f]' - ${(fou)mapfile[$file]}
sort
これにより、外部コマンドが複数回実行されるのを防ぎ、代わりにo
パラメータu
拡張フラグを使用して行を並べ替えて一意に並べ替えます。入力から空白行(存在する場合)を削除し、隠しファイルをスキップします(D
必要に応じてglob修飾子を追加します)。
GNUとは異なり、sort -u
バイトzsh
単位で等しくない2つの文字列は重複と見なされないため(同じ順序であっても)ロケールをCに変更する必要はありません。
$ロケールヘッダー文字マップ 英国式英語環境 UTF-8 $a=(