Удалить все файлы кроме последних

Обновлено: 07.07.2024

У меня есть папка, содержащая некоторые ревизии ревизий подвариантов (они выписаны при запуске рецепта развертывания capistrano).

что я хочу сделать, это то, что для сохранения последних 3 ревизий, которые были проверены capistrano script и удаления других, поэтому для этого я планирую запустить некоторую команду на терминале с помощью команды запуска, на самом деле capistrano hasn Здесь нет ничего, кроме команды unix.

Я пытался запустить команду, чтобы получить список файлов, за исключением последних трех, и удалить остальные, я мог бы получить список файлов, используя следующую команду.

теперь, если я добавлю rm -Rf в конец этой команды, он возвращает меня с файлом, который не найден для удаления. так что очевидно, потому что это возвращает только имя папки, а не полный путь к папке.

В любом случае, чтобы удалить эти файлы/папки с помощью одной команды unix?

спросил(а) 2010-12-15T09:32:00+03:00 10 лет, 11 месяцев назад

Ниже приведен полезный способ выполнения задачи.

для Linux и HP-UX:

для SunOS:

rm `(ls -t | head -n 100; ls) | sort | uniq -u`

ответил(а) 2014-02-16T03:15:00+04:00 7 лет, 9 месяцев назад

Хорошо, в вашем script есть несколько ошибок.

Во-первых, и наиболее проблематично, эта строка:

ls -t вернет список файлов в порядке их последнего времени модификации, начиная с самого последнего изменения. head -n 3 говорит только о списке первых трех строк. Так что это говорит "дайте мне список только трех последних измененных файлов", которые я не думаю, что вы хотите.

Я не совсем уверен, что вы делаете со второй командой ls , но я уверен, что просто собираюсь объединить все файлы в каталоге в ваш список. Это означает, что когда он получает sort ed и uniq 'ed, вы просто останетесь с алфавитным списком всех файлов в этом каталоге. Когда это передается на что-то вроде xargs rm , вы уничтожите все в этом каталоге.

Далее, sort | uniq не нуждается в части uniq . Вы можете просто использовать переключатель -u на sort , чтобы избавиться от дубликатов. Вам все равно не нужна эта часть.

Наконец, фактическое удаление каталога. С этой стороны у вас это было правильно в вашем вопросе: просто используйте rm -r

Здесь самый простой способ сделать это:

Вот что здесь происходит:

    ls -t1 печатает список, один файл/каталог на строку, всех файлов в /var/path/to/folder , упорядочиваясь по самой последней дате изменения.
    tail -n +4 печатает все строки на выходе ls -t1 , начиная с четвертой строки (т.е. три последних измененных файла не будут перечислены)
    xargs rm -r говорит удалить любой файл, выводимый из tail . -r означает рекурсивно удалять файлы, поэтому, если он встречает каталог, он удалит все в этом каталоге, а затем удалит сам каталог.

Обратите внимание, что я ничего не сортирую или не удаляю никаких дубликатов. Это потому, что:

    ls только один раз сообщает файл, поэтому для удаления не требуется дубликатов
    Вы удаляете все файлы, переданные в любом случае, поэтому не имеет значения, в каком порядке они удалены.

Все это имеет смысл?

Так как я ошибся в ls , указав полный путь при передаче абсолютного каталога, и поскольку вы не сможете выполнить cd , возможно, вы могли бы использовать tail .

Есть ли простой способ в довольно стандартной среде UNIX с bash запустить команду для удаления из каталога всех файлов X, кроме самых последних?

Чтобы дать немного более конкретный пример, представьте, что какое-то задание cron записывает файл (например, файл журнала или зарезервированную резервную копию) в каталог каждый час. Мне нужен способ запустить другое задание cron, которое удаляло бы самые старые файлы в этом каталоге, пока их не станет меньше, скажем, 5.

И, чтобы быть ясным, присутствует только один файл, его никогда не следует удалять.

Более простой вариант ответа thelsdj:

Ls -tr отображает все файлы, сначала самые старые (-t сначала самые новые, -r наоборот).

Head -n -5 отображает все, кроме 5 последних строк (т.е. 5 самых новых файлов).

Xargs rm вызывает rm для каждого выбранного файла.

Необходимо добавить --no-run-if-empty в xargs, чтобы он не выходил из строя, когда файлов меньше 5. Ls -1tr | голова -n -5 | xargs rm <---------- вам нужно добавить -1 к ls, иначе вы не получите вывод списка для головы, чтобы правильно работать с @AlJoslin, -1 используется по умолчанию, когда вывод идет в конвейер, поэтому здесь это не обязательно. Это имеет гораздо более серьезные проблемы, связанные с поведением по умолчанию xargs при синтаксическом анализе имен с пробелами, кавычками и т. Д. Похоже, что --no-run-if-empty не распознается в моей оболочке. Я использую Cmder в Windows. Возможно, потребуется использовать параметр -0 , если имена файлов могут содержать пробелы. Хотя еще не тестировал. исходный код

Требуется поиск GNU для -printf и сортировка GNU для -z, GNU awk для "\ 0" и GNU xargs для -0, но обрабатывает файлы со встроенными символами новой строки или пробелами.

На первый взгляд, меня удивляет сложность (или, если на то пошло, необходимость) логики awk . Мне не хватает некоторых требований в вопросе OP, которые делают это необходимым? Даффи: sub () удаляет метку времени, по которой выполняется сортировка. Отметка времени, созданная "% T @", может включать дробную часть. Разделение по пространству с помощью FS разрывает пути с вложенными пробелами. Я полагаю, что удаление до первого пробела работает, но его почти так же трудно читать. Разделители RS и ORS не могут быть установлены в командной строке, потому что они NUL. Даффи: Я всегда с подозрением отношусь к сырой оболочке, возможно, из-за византийских опасений по поводу цитирования. Теперь я думаю, что GNU sed -z -e 's/[^ ]* //; 1,5d' - самый ясный. (или, возможно, sed -n -z -e 's/[^ ]* //; 6,$p' .

Эта версия поддерживает имена с пробелами:

Эта команда некорректно обрабатывает файлы с пробелами в именах. (ls -t|head -n 5;ls) - это группа команд. Он распечатывает 5 последних файлов дважды. sort объединяет идентичные строки. uniq -u удаляет дубликаты, так что остаются все файлы, кроме 5 самых последних. xargs rm вызывает rm для каждого из них. Это удалит все ваши файлы, если у вас их 5 или меньше! Добавьте --no-run-if-empty в xargs , как в (ls -t|head -n 5;ls)|sort|uniq -u|xargs --no-run-if-empty rm , обновите ответ. Даже тот, который «поддерживает имена с пробелами», опасен. Рассмотрим имя, содержащее буквальные кавычки: touch 'foo " bar' отбросит всю остальную часть команды. . безопаснее использовать xargs -d $'\n' , чем вставлять кавычки в ваш контент, хотя NUL-разделитель входного потока (что требует использования чего-то другого, кроме ls , чтобы действительно действовать правильно ) - идеальный вариант.

Удалите все, кроме 5 (или любого другого числа) самых последних файлов в каталоге.

Мне это нужно было только для рассмотрения моих архивных файлов. измените ls -t на ls -td *.bz2 Я использовал это для каталогов, изменив его на rm -rf ls -t | awk 'NR>1' (мне нужны были только самые свежие). Спасибо! ls -t | awk 'NR>5' | xargs rm -f , если вы предпочитаете каналы и вам нужно подавить ошибку, если удалять нечего. Возможно, кратко и читабельно, но опасно в использовании; при попытке удалить файл, созданный с помощью touch 'hello * world' , это приведет к удалению абсолютно всего в текущем каталоге . ПРЕДУПРЕЖДЕНИЕ Убедитесь, что вы запускаете это из каталога, из которого будут удалены файлы! Я по глупости запустил это из каталога рабочего кода, состоящего из 100 файлов или около того, и он уничтожил всю эту ерунду !! К счастью, за 30 минут до этого я сделал резервную копию (Уф!)

Все эти ответы терпят неудачу, если в текущем каталоге есть каталоги. Вот что работает:

работает, когда в текущем каталоге есть каталоги

пытается удалить каждый файл, даже если предыдущий не удалось удалить (из-за разрешений и т. д.)

безопасен, когда количество файлов в текущем каталоге чрезмерно и xargs обычно вас облажает ( -x )

не учитывает пробелы в именах файлов (возможно, вы используете неправильную ОС?)

Что произойдет, если find вернет больше имен файлов, чем может быть передано в одной командной строке в ls -t ? (Подсказка: вы получаете несколько запусков ls -t , каждое из которых сортируется только индивидуально, вместо того, чтобы иметь глобально правильный порядок сортировки; таким образом, этот ответ плохо работает при работе с достаточно большими каталогами).

Список имен файлов по времени модификации, заключая в кавычки каждое имя файла. Исключить первые 3 (3 последних). Удалите оставшееся.

ИЗМЕНИТЬ после полезного комментария от mklement0 (спасибо!): Исправлен аргумент -n + 3, и обратите внимание, что это не будет работать должным образом, если имена файлов содержат символы новой строки и / или каталог содержит подкаталоги.

Параметр -Q , похоже, не существует на моем компьютере. Хм, эта опция присутствует в основных утилитах GNU около 20 лет, но не упоминается в вариантах BSD. Вы на Mac? Я действительно являюсь. Не думал, что существуют различия в таких действительно основных командах между современными системами. Спасибо за Ваш ответ ! Когда нечего удалять, вы вызываете xargs с опцией --no-run-if-empty : ls -tQ | tail -n+4 | xargs --no-run-if-empty rm

Игнорирование символов новой строки означает игнорирование безопасности и хорошего кодирования. wnoise имел единственный хороший ответ. Вот его вариант, в котором имена файлов помещаются в массив $ x

Я бы посоветовал очистить IFS - иначе вы рискуете потерять завершающие пробелы в именах файлов. Можно указать это на команду чтения: while IFS= read -rd ''; do

Если в именах файлов нет пробелов, это сработает:

Если в именах файлов есть пробелы, например,

  • получить список файлов в хронологическом порядке, одна колонка
  • получить все, кроме первых 5 (в этом примере n = 5)
  • первая версия: отправьте их в rm
  • вторая версия: создать скрипт, который удалит их должным образом
Не забывайте трюк while read для работы с пробелами: ls -C1 -t | awk 'NR>5' | while read d ; do rm -rvf "$d" ; done @pinkeen, не совсем безопасно, как указано там. while IFS= read -r d было бы немного лучше - -r предотвращает использование литералов обратной косой черты для read , а IFS= предотвращает автоматическое обрезание конечных пробелов. Кстати, если вас беспокоят враждебные имена файлов, это чрезвычайно опасный подход. Рассмотрим файл, созданный с помощью touch $'hello \'$(rm -rf

)\' world' ; буквальные кавычки внутри имени файла будут противоречить буквальным кавычкам, которые вы добавляете с помощью sed , в результате чего код внутри имени файла будет выполняться.

(для ясности, «this» выше относится к форме | sh , которая содержит уязвимость инъекции оболочки).

Я понимаю, что это старая ветка, но, возможно, кому-то это пригодится. Эта команда найдет файлы в текущем каталоге:

Затем отсортируйте их по отметкам времени:

Затем удалите из списка 4 последних файла:

Возьмите второй столбец (имя файла, а не метку времени):

А затем заверните все это в оператор for:

Это может быть более подробная команда, но мне гораздо больше повезло, что я смог настроить таргетинг на условные файлы и выполнить для них более сложные команды.

Предполагая, что вас не интересуют текущие каталоги, и у вас не будет более 999 файлов (выберите большее число, если хотите, или создайте цикл while).

В *(.om[6,999]) . означает файлы, o означает порядок сортировки вверх, m означает дату изменения (поместите a для времени доступа или c для изменения индексного дескриптора), [6,999] выбирает диапазон файлов, поэтому сначала не rm 5.

Интригует, но хоть убей, я не смог заставить работать квалификатор sorting glob ( om ) (любая сортировка, которую я пробовал, не оказала никакого эффекта - ни на OSX 10.11.2 (пробовал с zsh 5.0.8) и 5.1.1), ни в Ubuntu 14.04 (zsh 5.0.2)) - что мне не хватает? Что касается конечной точки диапазона: ее не нужно жестко программировать, просто используйте -1 , чтобы обратиться к последней записи и, таким образом, включить все оставшиеся файлы: [6,-1] .

Нашел интересный cmd в Sed-Onliners - удалите последние 3 строки - он идеально подходит для другого способа снять шкуру с кошки (хорошо, нет), но идея:

Удаляет все файлы, кроме 10 последних (большинство недавних).

Если меньше 10 файлов, файл не будет удален, и у вас будет: error head: недопустимое количество строк - 0

Мне нужно было элегантное решение для busybox (роутера), все решения xargs или массивов были для меня бесполезны - там нет такой команды. find и mtime - неправильный ответ, поскольку мы говорим о 10 элементах, а не обязательно о 10 днях. Ответ Эспо был самым коротким, ясным и, вероятно, самым исчерпывающим.

Ошибка с пробелами и отсутствие файлов для удаления решаются стандартным способом:

Более образовательная версия: мы можем сделать все это, если будем использовать awk по-другому. Обычно я использую этот метод для передачи (возврата) переменных из awk в sh. Поскольку мы все время читаем, что сделать невозможно, я позволю себе отличиться: вот метод.

Пример для файлов .tar без проблем с пробелами в имени файла. Для проверки замените «rm» на «ls».

ls -td *.tar перечисляет все файлы .tar, отсортированные по времени. Чтобы применить ко всем файлам в текущей папке, удалите часть «d * .tar».

awk 'NR>7. пропускает первые 7 строк

print "rm \"" $0 "\"" создает строку: rm "имя файла"

eval выполняет это

Поскольку мы используем rm , я бы не стал использовать указанную выше команду в сценарии! Более разумное использование:

В случае использования ls -t команда не причинит вреда на таких глупых примерах, как: touch 'foo " bar' и touch 'hello * world' . Не то чтобы мы когда-либо создавали файлы с такими именами в реальной жизни!

Примечание. Если бы мы хотели передать переменную в sh таким образом, мы бы просто изменили print (простая форма, пробелы не допускаются):

удалить файлы Linux

Иногда вам нужно удалить почти все файлы из каталога, но вы хотите сохранить один или несколько из них. Когда их много, идти по одному - утомительное занятие. Это не лучший вариант, есть способы значительно упростить работу в Linux и можно сразу избавиться от всех, что вам нужно.

Например, вы можете удалить только те, которые начинаются с определенного имени, или те, которые имеют определенное расширение, и так далее. Все что возможноФактически, в других случаях я уже показывал аналогичные уроки в LxA. Здесь вы можете шаг за шагом и простым способом следовать руководству, чтобы удалить все нужные файлы, кроме тех, которые вы хотите сохранить.

И самое лучшее то, что вам не нужно будет устанавливать какую-либо программу, это легко сделать с помощью таких команд, как rm и find. То есть программы, которые уже предустановлены в любом дистрибутиве Linux. И, конечно же, метод будет основан на поиске шаблонов и использовании этих совпадений для удаления только того, что вы хотите.

Ну чтобы там исключить несколько альтернатив, Кто они такие…

Удалить файлы из каталога с помощью rm

Ну, чтобы использовать команда rm Чтобы избавиться от того, что вы чувствуете, вы должны знать перед некоторыми способами выявления закономерностей:

  • * (список шаблонов) - соответствует нулю или более вхождений указанных шаблонов
  • ? (список шаблонов) - соответствует нулю или одному вхождению указанных шаблонов
  • + (список шаблонов) - соответствует одному или нескольким экземплярам указанных шаблонов
  • @ (список шаблонов) - соответствует одному из указанных шаблонов
  • ! (список шаблонов) - соответствует чему угодно, кроме одного из заданных шаблонов

к активировать extglob Чтобы использовать их, вы должны сначала выполнить следующую команду:

глаз! Я не указываю это, но предполагается, что у вас есть разрешения на выполнение этих операций и что вы находитесь внутри этого каталога, когда выполняете команду rm. Будьте осторожны с этим, потому что, если вы запустите его по другому пути, вы можете удалить файлы, которые вам не нужны. То есть перед выполнением этих команд убедитесь, что вы вошли в нужный каталог с помощью cd.

Теперь вы можете использовать rm, чтобы удалить все, что захотите. Например, удалить все файлы из каталога, кроме тех, которые соответствуют имени «Lxa»:

Вы также можете указать два или более имен, которые вы не хотите удалять. Например, чтобы избежать удаления lxa и desdelinux:

Вы можете удалить все файлы, минус те, с расширением .mp3. Например:

В конце вы можете вернуться к отключить extglob:

Удалить файлы из каталога с помощью find

Другая альтернатива rm - используйте find, чтобы удалить то, что вам нравится. Вы можете использовать канал и xargs с rm или использовать параметр -delete для поиска. То есть общий синтаксис будет таким:

Например, представьте, что вы хотите удалить все файлы из каталога, кроме файлов с расширением .jpg, вы можете использовать одну из этих двух команд, поскольку обе они дают одинаковый результат:

Вместо этого, если вы хотите добавить дополнительный узор, ты тоже мог бы. Например, предположим, что вы не хотите удалять файлы .pdf или .odt из каталога:

Конечно, вы можете сделать то же самое с | и xargs, как в предыдущем примере. Кстати, мы использовали -не отрицать, но вы можете удалить это, чтобы сделать его положительным, то есть удалить совпадающие шаблоны, а не исключать их.

Удалите файлы из каталога с помощью переменной GLOBIGNORE

Наконец, есть Другая альтернатива чтобы найти и rm, и он использует переменную среды, чтобы указать файлы, которые вы хотите удалить или исключить. Например, представьте, что вы хотите удалить все файлы в каталоге с именем Downloads, сохранив файлы .pdf, .mp3 и .mp4. В этом случае вы можете сделать следующее:

Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.

Полный путь к статье: Любители Linux » GNU / Linux » Системное администрирование » Как удалить все файлы в каталоге, кроме одного

Есть ли простой способ в довольно стандартной среде UNIX с bash запустить команду для удаления всех, кроме самых последних файлов X из каталога?

Чтобы дать более конкретный пример, представьте, что какое-то задание cron записывает файл (скажем, файл журнала или tar-ed up backup) в каталог каждый час. Я бы хотел, чтобы было выполнено другое задание cron, которое удаляло бы самые старые файлы в этом каталоге, пока их не будет меньше, скажем, 5.

И чтобы быть ясным, есть только один файл, он никогда не должен быть удален.

ОТВЕТЫ

Ответ 1

Проблемы с существующими ответами:

  • невозможность обработки имен файлов со встроенными пространствами или символами новой строки.
    • в случае решений, которые ссылаются на rm непосредственно на подменю без кавычек ( rm `. ` ), существует дополнительный риск непреднамеренного подталкивания.

    wnoise answer решает эти проблемы, но решение является специфичным для GNU (и довольно сложным).

    Здесь прагматичное, решение, совместимое с POSIX, которое поставляется с одним caveat: оно не может обрабатывать имена файлов со встроенными символами новой строки, но я не считаю, мировой интерес для большинства людей.

    Вышеупомянутый неэффективен, потому что xargs должен вызывать rm один раз для каждого имени файла.
    Ваша платформа xargs может позволить вам решить эту проблему:

    Если у вас GNU xargs , используйте -d '\n' , что делает xargs считать каждую строку ввода отдельным аргументом, но передает столько аргументов, сколько будет соответствовать командной строке сразу

    -r ( --no-run-if-empty ) гарантирует, что rm не вызывается, если нет ввода.

    Если у вас BSD xargs (в том числе на OS X), вы можете использовать -0 для обработки NUL -сепарализованного ввода после первого перевода строк новой строки до NUL ( 0x0 ) символов, который также передает (обычно) все имена файлов одновременно (также будет работать с GNU xargs ):

    Объяснение:

    • ls -tp печатает имена элементов файловой системы, отсортированные по тому, как недавно они были изменены, в порядке убывания (сначала самые измененные элементы) ( -t ), с каталогами, напечатанными с завершающим / , чтобы отметить их как таковые ( -p ).
    • grep -v '/$' затем вытесняет каталоги из результирующего списка, опуская строки ( -v ), имеющие конечный / ( /$ ).
      • Предостережение. Поскольку символическая ссылка, указывающая на каталог, технически не является самим каталогом, такие символические ссылки не будут исключены.
      • xargs -I <> rm -- <> определяет placeholder <> , который представляет каждую строку ввода в целом, поэтому rm затем вызывается один раз для каждой строки ввода, но имена файлов со встроенными пространствами обрабатываются правильно.
      • -- во всех случаях гарантирует, что любые имена файлов, которые начинаются с - , не ошибаются для параметров с помощью rm .

      A вариация по исходной задаче , если соответствующие файлы нужно обрабатывать отдельно или собирать в массиве оболочки:

      Ответ 2

      Эта версия поддерживает имена с пробелами:

      Ответ 3

      Удалите все, кроме 5 (или сколько угодно) самых последних файлов в каталоге.

      Ответ 4

      Упрощенный вариант ответа thelsdj:

      ls -tr отображает все файлы, самые старые сначала (сначала -t, -r обратный).

      head -n -5 отображает все, кроме 5 последних строк (т.е. 5 самых новых файлов).

      xargs rm вызывает rm для каждого выбранного файла.

      Ответ 5

      Требуется найти GNU для -printf и GNU sort для -z и GNU awk для "\ 0" и GNU xargs для -0, но обрабатывает файлы со встроенными новыми строками или пробелами.

      Ответ 6

      Все эти ответы терпят неудачу, если в текущем каталоге есть каталоги. Здесь что-то работает:

      работает, когда в текущем каталоге есть каталоги

      пытается удалить каждый файл, даже если предыдущий не может быть удален (из-за разрешений и т.д.).

      не работает безопасно, когда количество файлов в текущем каталоге чрезмерно и xargs будет обычно зависеть от вас ( -x )

      не поддерживает пробелы в именах файлов (возможно, вы используете неправильную ОС?)

      Ответ 7

      Введите имена файлов по времени модификации, указав каждое имя файла. Исключить первые 3 (3 последних). Удалите оставшиеся.

      EDIT после полезного комментария от mklement0 (спасибо!): исправленный аргумент -n + 3, и обратите внимание, что это не будет работать так, как ожидалось, если имена файлов содержат символы новой строки и/или каталог содержит подкаталоги.

      Ответ 8

      Игнорирование новых строк игнорирует безопасность и хорошее кодирование. у wnoise был единственный хороший ответ. Вот его вариант, который помещает имена файлов в массив $x

      Ответ 9

      Если имена файлов не имеют пробелов, это будет работать:

      Если имена файлов имеют пробелы, что-то вроде

      • получить список файлов в порядке времени, один столбец
      • получить все, кроме первых 5 (n = 5 для этого примера)
      • первая версия: отправьте их в rm
      • вторая версия: gen a script, которая удалит их правильно

      Ответ 10

      Предполагая, что вам не нужны текущие каталоги, и у вас не будет более 999 файлов (выберите большее количество, если хотите, или создайте цикл while).

      В *(.om[6,999]) , . означает файлы, o означает порядок сортировки вверх, средство m по дате модификации (поместите a для времени доступа или c для изменения inode), [6,999] выбирает диапазон файлов, поэтому сначала не rm 5.

      Ответ 11

      нашел интересный cmd в Sed-Onliners - удалите последние 3 строки - fnd он идеально подходит для другого способа скинуть кошку (хорошо, но не), но идея:

      Ответ 12

      Я понимаю, что это старая нить, но, возможно, кто-то выиграет от этого. Эта команда найдет файлы в текущем каталоге:

      Затем отсортируйте их по меткам времени:

      Затем отмените 4 последних файла из списка:

      Возьмите второй столбец (имя файла, а не временную метку):

      И затем оберните все это в инструкцию for:

      Это может быть более сложная команда, но мне гораздо лучше удавалось настраивать условные файлы и выполнять с ними более сложные команды.

      Ответ 13

      Ответ 14

      Я сделал это в оболочке bash script. Использование: keep NUM DIR где NUM - количество файлов для хранения, а DIR - это каталог для очистки.

      Ответ 15

      Удаляет все, кроме 10 последних (большинство ретентатов) файлов

      Если менее 10 файлов не удаляется файл, и у вас будет: error head: недопустимый номер строки - 0

      Ответ 16

      Запуск на Debian (предположим, что он же на других дистрибутивах я получаю: rm: невозможно удалить каталог `.. '

      что довольно неприятно.

      Во всяком случае, я подделал выше, а также добавил grep к команде. В моем случае у меня есть 6 резервных файлов в каталоге, например. file1.tar file2.tar file3.tar и т.д., и я хочу удалить только самый старый файл (удалите первый файл в моем случае)

      script Я побежал, чтобы удалить самый старый файл:

      ls -C1 -t | grep file | awk 'NR > 5' | xargs rm

      Это (как указано выше) удаляет первый из моих файлов, например. file1.tar это также оставляет файл file2 file4 file5 и file6

      Читайте также: