Мне нужно знать самый быстрый способ в PHP или Linux Command Shell, чтобы уменьшить текстовый файл с более чем 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
$() Работает так же, как backticks (он оценивает все, что внутри, и приравнивается к выходу указанной команды), за исключением того, что он работает лучше в строках. На моей машине Linux строка оценивается (значение « tail запускается) перед выходом в файл (что вызывает проблемы с tail file >file открывается и усекается – как только команда начинается). Я думаю, это потому, что echo является встроенным, но не цитируйте меня.
EDIT: На самом деле, я посмотрел поближе. Это потому, что tail находится в строке. Существует несколько этапов: здесь мы нуждаемся в интерполяции, перенаправлении и выполнении, которые всегда происходят в определенном порядке (а именно, только что приведенном порядке). И в процессе интерполяции строки Bash должен запустить команду внутри нее. Перед выполнением любого перенаправления. С tail file >file прямого 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 строк.) Вероятно, лучше использовать временный файл, если вам не нужно сохранить тот же номер индексного дескриптора по какой-то нечетной причине.
tail -n 10 yourfile > yourfile.tmp && mv yourfile.tmp yourfile
Отредактировано, чтобы предоставить исключительно последние 10 строк файла с потенциально более чем 10 строками.
В Linux вы могли бы сделать
tail -n 10 path/to/file > path/to/output/file
Это займет последние десять строк (# строк, заданных по значению после -n) файла, а затем добавьте их в другой файл.
Если вы хотите переписать существующий файл только своими последними десятью строками,
tail -n 10 path/to/file > path/to/output/file && mv path/to/output/file path/to/file
Обратите внимание, что первый пример выводится в другой файл, а второй перезаписывает существующий файл.
Вы также можете сделать это на PHP, используя exec () с командой оболочки внутри, или более трудоемкий способ чтения всего файла в массив с файлом (), а затем взять последние десять элементов массива и добавить их обратно в файл с файлом fwrite () или аналогичным.