
tail
ファイルの最後の100行を同じファイルに書きたいのですが、コマンドはtail -n 100 file > file
機能しません。元のファイルからすべての内容を読み取る前に、標準出力が「ライブ」ファイルに書き込まれるためとします。
出力をパイプに接続する方法はありますか?何その後、100行すべてが表示されるまで保存してからファイルに出力しますか?それとも、このようにファイルを減らす別の方法ですか?
答え1
sponge
~からその他のユーティリティいいですね。それ:
標準入力を受け取り、ファイルに書き込む
次のように使用します。
tail -n 100 file | sponge file
希望の効果を得るために。
答え2
もちろんSEでいよいよこの質問を投げた瞬間、答えが現れた。私の要件にはあまり適していないので、次のように書いてください。
tail -n 100 file | less > file
答え3
存在する:
tail -n 100 file > file
シェルはプロセスを分岐し、書き込み用にfile
開き、切り取り(空のファイルにし)、tail
そのプロセスで実行します。切り捨てなしで開くには、リダイレクト演算子をfile
使用できます<>
。
tail -n 100 file 1<> file
しかし、問題はまったく切り捨てが発生しないということです。つまり、file
最後の100行を上書きしますが、この100
行以降はファイルの元の内容がそのまま残ります。したがって、tail
完了したら、切り捨てるために別のコマンドを呼び出す必要があります。
{ tail -n 100 file; perl -e 'truncate STDOUT, tell STDOUT'; } 1<> file
答え4
次のことができます。
printf '%s\n' "$(tail -n 100 file)" > file