В первом случае оболочка считает, что есть команда после sudo
, которую вы пытаетесь запустить, -
, потому что такой команды нет, оболочка сообщает, что команда не найдена. При запуске команды, которой предшествует sudo
, по умолчанию она запрашивает ваш пароль.
Во втором случае оболочка распознает, что вы выполняете команду sudo
с параметром -i
. Пароль больше не запрашивается, потому что вы только что ввели его правильно, когда пытались запустить первую команду. (по умолчанию учетные данные кэшируются на 15 минут)
Предполагая, что вы работаете с инструментами 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
Примечания:
d
. Он включает ведущие
и конечные цифры. Если часть даты отсутствует, то пустая строка
присваивается d
. «$ d»
- пустая строка.
Это необходимо для предотвращения (3) от удаления файла, поскольку date -d
будет успешным, если в качестве аргумента указать пустую строку. (Это похоже на ошибку
в GNU date
, но, возможно, такое поведение было задумано.) "$ d"
содержит действительную дату. Обратите внимание, что
date -d
будет успешным, если часть года в дате содержит более 4 цифр
, при условии, что части месяца и дня действительны. Теперь это действительно
для защиты вашего кода в будущем! 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-DDZZ
donde XX
y ZZ
son 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 +5
es 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
.