Это связано с тем, что bash обрабатывает перенаправление >
первым, удаляя содержимое файла. Затем он выполняет команду. Если бы вы использовали >>
, последние 50 строк были бы добавлены в конец того, что в настоящее время находится в файле. В этом случае вы бы повторили 50 одинаковых строк.
Команда работает, как и ожидалось, при перенаправлении в другой файл. Вот один из способов записать последние 50 строк файла в файл с таким же именем:
tail -50 /home/pi/Documents/test > /home/pi/Documents/test2 && mv /home/pi/Documents/test2 /home/pi/Documents/test
Это сначала записывает последние 50 строк во временный файл, который затем перемещается с помощью mv
замены исходного файла.
Как отмечено в комментариях, это не будет работать, если файл все еще открыт. Перемещение файла также создает новый индекс и может изменить владельца и разрешения. Лучший способ сделать это, используя временный файл:
tail -50 /home/pi/Documents/test > /home/pi/Documents/test2 ; cat /home/pi/Documents/test2 > /home/pi/Documents/test
Временный файл также может быть удален, хотя каждый раз, когда это происходит, его содержимое будет перезаписываться.