
Я пытаюсь удалить старые файлы, но должен сохранить последние 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.