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

В первом случае оболочка считает, что есть команда после sudo , которую вы пытаетесь запустить, - , потому что такой команды нет, оболочка сообщает, что команда не найдена. При запуске команды, которой предшествует sudo , по умолчанию она запрашивает ваш пароль.

Во втором случае оболочка распознает, что вы выполняете команду sudo с параметром -i . Пароль больше не запрашивается, потому что вы только что ввели его правильно, когда пытались запустить первую команду. (по умолчанию учетные данные кэшируются на 15 минут)

2
07.12.2016, 16:31
2 ответа

Предполагая, что вы работаете с инструментами GNU, это должно предотвратить ложные срабатывания, о которых говорит Бэби:

find /directory -type f -mtime +5 -print | while read f; do
    n=`basename "$f"`
    d=`expr "X$n" : 'X.*\([0-9]\{4,\}-[0-9]\{2\}-[0-9]\{2,\}\)'` # (1)
    test -n "$d" || continue                                     # (2)
    date -d "$d" >/dev/null 2>&1 && rm "$f"                      # (3)
done

Примечания:

  • (1) присваивает дату в имени файла d . Он включает ведущие и конечные цифры. Если часть даты отсутствует, то пустая строка присваивается d .
  • (2) перейдет к следующей итерации, если «$ d» - пустая строка. Это необходимо для предотвращения (3) от удаления файла, поскольку date -d будет успешным, если в качестве аргумента указать пустую строку. (Это похоже на ошибку в GNU date , но, возможно, такое поведение было задумано.)
  • (3) удалит файл, если "$ d" содержит действительную дату. Обратите внимание, что date -d будет успешным, если часть года в дате содержит более 4 цифр , при условии, что части месяца и дня действительны. Теперь это действительно для защиты вашего кода в будущем!
1
27.01.2020, 22:04

Usando GNUfind:

find. -type f -mtime +5 \
    -regextype egrep -regex '.*[0-9]{4}-[0-9]{2}-[0-9]{2}[^/]*$' \
    -delete

La expresión regular coincidirá con cualquier cadena en el nombre base de un nombre de ruta que contenga una fecha en el formulario YYYY-MM-DD. Tenga en cuenta que también podemos hacer coincidir XXYYYY-MM-DDZZdonde XXy ZZson ​​algunos otros caracteres.

El [^/]*$al final asegura que en realidad estamos haciendo coincidir la expresión con el nombre base de la ruta actual, y significa "no /para el resto de la cadena, por favor".

Usar un patrón comodín de shell en su lugar (más fácil de mantener):

find. -type f -mtime +5 \
    -name '*[0-9][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]*' \
    -delete

Tenga en cuenta que -mtime +5es para archivos cuya antigüedad como número entero de días es estrictamente mayor que 5, es decir, 6 días o más. Para archivos de 5 días o más, necesitaría -mtime +4.

3
27.01.2020, 22:04

Теги

Похожие вопросы