Мені потрібно було елегантне рішення для зайнятого ящика (маршрутизатора), всі рішення 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"