PHP または Linux コマンド シェルで、10 行を超えるテキスト ファイルを最後の 10 行のみに縮小するための最速の方法を知る必要があります。この例では 10 行を使用します。
ありがとう :)
ファイルを最後まで減らすには、行は
tail -n 10 /path/to/file > /path/to/file.tmp && rm /path/to/file && mv /path/to/file.tmp /path/to/file
説明:
tail
ファイルの最後のn
行を出力します。
>
それをファイルに書き込みます。
&&
コマンドを連鎖させるためのものです。
rm
ファイルを削除します。
mv
ファイルの名前を変更します(または別の場所に移動します)。
本当に新しいファイルを生成したくない場合は、試してみてください
echo "$(tail -n 10 path/to/file)" >path/to/file
は$()
、文字列でより適切に機能することを除いて、バッククォートと同じように機能します (内部にあるものは何でも評価し、上記のコマンドの出力と同等です)。私のLinuxマシンではtail
、出力がファイルに送られる前に文字列が評価されます(実行されることを意味します)(これが問題の原因tail file >file
です;コマンドが開始されるとすぐにファイルが開かれ、切り捨てられます)。 ビルトインだからだと思いますecho
が、それについては引用しないでください。
編集: 実際、私は詳しく調べました。が文字列になっているからtail
です。いくつかのフェーズがあります。ここで注目するのは補間、リダイレクト、および実行です。これらは常に特定の定義された順序 (つまり、指定された順序) で発生します。また、文字列を補間する過程で、Bash は文字列内でコマンドを実行する必要があります。リダイレクトが行われる前。ストレートtail file >file
では、tail
プログラムが実際に出力を生成するため、コマンドが実行されるまで出力は発生しませんが、ファイルはその直前に書き込み用に (リダイレクトにより) 既に開かれており、そのファイルを書き込み用に開くと切り捨てられます。 )
phase tail file >file echo "$(tail file)" >file
-------------+---------------------------------+-------------------------------
interpolate nothing run "tail file"; get output (+)
redirect open file for write; set stdout open file for write; set stdout
execute run "tail file" (*) run 'echo "line\nline\n..."'
(*)
: 注、file
この時点ですでに書き込み用に開かれているため、現在は切り捨てられています。したがって、tail
0バイトを読み取ります。
(+)
:リダイレクトによって書き込み用に開かれる前file
に読み取られたため、すべてのデータを表示できました。tail
動作は明らかに定義されており、予測可能ですが、これはまだ私にはハッキリしているように感じます。これは bash arcana に依存しているため、取得しようとする行が多すぎたり長すぎたりすると、メモリの問題が発生する可能性があります。(最大 500 文字の行でテストしましたが、問題は見られませんでした。ただし、まだ 10 行を超えてテストしていません。) 同じ inode 番号を保持する必要がない限り、おそらく一時ファイルを使用する方がよいでしょう。奇妙な理由で。
tail -n 10 yourfile > yourfile.tmp && mv yourfile.tmp yourfile
10行を超える可能性のあるファイルの最後の10行のみを提供するように編集されました。
Linuxでは次のことができます
tail -n 10 path/to/file > path/to/output/file
これにより、ファイルの最後の10行(-nの後の値で指定された行数)が取得され、別のファイルに追加されます。
既存のファイルを最後の10行だけで上書きする場合は、次のようにします。
tail -n 10 path/to/file > path/to/output/file && mv path/to/output/file path/to/file
最初の例は別のファイルに出力し、2番目の例は既存のファイルを上書きすることに注意してください。
PHPでこれを行うには、内部のシェルコマンドでexec()を使用するか、file()を使用してファイル全体を配列に読み込み、配列の最後の10個の要素を取得してそれらをに追加するというより面倒な方法を使用します。 fwrite()などを使用したファイル。