サイズを小さくする必要があるファイルが多すぎます。私はほとんどの(すべてではない)ファイルに情報を失うことなく切り取ることができる終わりセクションがあることを発見しました。
Data 1
Data 2
something_unimportant_here END DATA
Rubbish 1
Rubbish 2
「END DATA」を含む行とその後のすべての行を削除し、そのパターンを含むファイルのみを変更してファイル(したがってすべて終了)を編集するにはどうすればよいですか?これにより、ディスクへの書き込みアクセスが最小限に抑えられます(多くのファイルと遅いディスク)。
可能であれば、ファイルの構文が正しいままになるように、ファイルに新しい最後の行(マイクローズタグ)を追加したいと思います。繰り返しますが、パターンを含むファイルでのみ可能です。
私はed
次のようなものを使うつもりです。
echo ',s/END DATA/ ???? '\\n'q'\\n'wq' | ed "$file"
ところで管理できないようですね? ? ?部分的に本当です。
予想出力:
Data 1
Data 2
NEW END
ベストアンサー1
sed -i
// perl -i
/ ¹などのファイルの新しいコピーを作成するのではなく、ファイルを直接カットしてこれを行うことがed
できるはずです。gawk -i /usr/share/awk/inplace.awk
使用perl
:
find . -name '*.txt' -type f -exec perl -ne '
BEGIN{@ARGV=map{"+<$_"}@ARGV} # open files in read+write mode in the
# while(<>) loop implied by -n
if (/END DATA/) {
seek ARGV,-length,1; # back to beginning of matching line
print ARGV "NEW END\n";
truncate ARGV, tell ARGV;
close ARGV; # skip to next file
}' {} +
perl
一致するものが見つかると、読み取りは停止され、それが NEW END\n
記録される唯一のものであるため、I / Oが最小化されます。また、内部書き込みを行うため、ファイルメタデータ(所有権、権限、acl、スパース...)が保存され、ハードリンクが破損することはありません。
-exec {} +
通話回数も最小限に抑えることができますperl
。
^使用しないでください-i inplace
現在の作業ディレクトリから最初に拡張機能をgawk
ロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'