Скрипт Bash для удаления самых старых файлов, но сохранения самых новых, включая подкаталоги

Скрипт Bash для удаления самых старых файлов, но сохранения самых новых, включая подкаталоги

Я пытаюсь удалить старые файлы, но должен сохранить последние 3-дневные файлы журнала. Я попробовал следующую команду:

ls -tr /home/httpd/htdocs/имя_пути/имя_пути/config//сборка/журналов/приложений/.log | tail -n +4 | xargs rm --

но он был удален, все файлы остались только 3 файла в одной папке. но я хочу оставить 3 файла в каждой папке отдельно.

может ли кто-нибудь помочь мне решить эту проблему.

решение1

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

#!/bin/bash
dirs=($(find /tmp/test -type d))
for dir in "${dirs[@]}"; do
  cd "$dir"
  ls -pt | grep -v / | tail -n +4 | xargs rm -f
done

замените /tmp/testна имя вашего каталога.

решение2

Вы можете использовать эту команду:

ls -t path | sed -e '1,3d' | xargs -d '\n' rm

Или в цикле:

for d in $(find path -type d); do
  ls -t "$d" | sed -e '1,3d' | xargs -d '\n' rm
done

Где:

  • ls -t: выводит список файлов в порядке убывания времени изменения, по одному имени файла в строке.
  • sed -e '1,3d': удаляет первые 3 строки
  • xargs -d '\n' rm: для каждой входной строки (без завершающего символа новой строки) передает ее в качестве аргумента rm.
  • -d '\n': это необходимо для повышения эффективности, чтобы xargs рассматривал каждую входную строку как отдельный аргумент, но при этом передавал столько аргументов, сколько поместится в командной строке за один раз, чтобы rm не вызывался повторно для каждого из них.

Для получения дополнительных возможностей см. пост Удалить все файлы X, кроме самых последних, в bash.

Связанный контент