Мені потрібно було елегантне рішення для зайнятого ящика (маршрутизатора), всі рішення xargs або масиву були для мене марними - такої команди там немає. Знайти і mtime - це не відповідна відповідь, оскільки ми говоримо про 10 пунктів, а не обов'язково 10 днів. Відповідь Еспо була найкоротшою та найчистішою та, ймовірно, найбільш неперевершеною.
Помилка з пробілами, і коли жодні файли не потрібно видаляти, обидва просто вирішуються стандартним способом:
rm "$(ls -td *.tar | awk 'NR>7')" 2>&-
Трохи освітніша версія: ми можемо це зробити все, якщо будемо використовувати awk по-іншому. Зазвичай я використовую цей метод для передачі (повернення) змінних від awk до sh. Оскільки ми весь час читали, що неможливо зробити, я прошу відрізнятись: ось метод.
Приклад для файлів .tar без проблем щодо пробілів у імені файлу. Для перевірки замініть "rm" на "ls".
eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}')
Пояснення:
ls -td *.tarперелічені всі файли .tar, відсортовані за часом. Щоб застосувати до всіх файлів у поточній папці, видаліть частину "d * .tar"
awk 'NR>7... пропускає перші 7 рядків
print "rm \"" $0 "\"" будує рядок: rm "ім'я файлу"
eval виконує його
Оскільки ми використовуємо rm, я б не використовував вищезазначену команду в сценарії! Більш розумне використання:
(cd /FolderToDeleteWithin && eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}'))
У разі використання ls -tкоманди не завдасть ніякої шкоди на таких нерозумних прикладах, як: touch 'foo " bar'іtouch 'hello * world' . Не те, щоб ми коли-небудь створювали файли з такими іменами в реальному житті!
Sidenote. Якби ми хотіли передати змінну до sh таким чином, ми просто змінили б друк (проста форма, не допускається пробілів):
print "VarName="$1
встановити змінну VarNameдо значення $1. Кілька змінних можна створити за один раз. Це VarNameстає звичайною змінною sh і може бути нормально використане в сценарії або оболонці згодом. Отже, щоб створити змінні з awk та повернути їх до оболонки:
eval $(ls -td *.tar | awk 'NR>7 { print "VarName=\""$1"\"" }'); echo "$VarName"