Мне нужно знать самый быстрый способ в 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 () или аналогичным.