Це тому, що 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
заміни вихідного файлу.
Як зазначається в коментарях, це не працюватиме, якщо файл все ще відкритий. Переміщення файлу також створює новий inode і може змінити право власності та дозволи. Кращий спосіб зробити це за допомогою тимчасового файлу:
tail -50 /home/pi/Documents/test > /home/pi/Documents/test2 ; cat /home/pi/Documents/test2 > /home/pi/Documents/test
Тимчасовий файл також можна видалити, хоча кожного разу його вміст буде перезаписуватися.