Если вы хотите найти обычные файлы, возраст которых превышает 10 дней и которые последний раз изменялись в субботу (в часовом поясе пользователя, запустившего сценарий), с помощью GNU инструменты (и вы, похоже, работаете в системе GNU, поскольку используете специфичную для GNU опцию для date
и оболочки GNU), вы можете сделать:
find . -type f -mtime +10 -printf '%Tu%p\0' |
sed -zn 's/^6//p' |
tr '\0' '\n'
Хотя в конечном итоге GNU добавил (но другой ) stat
команда в начале 2000-х для запроса метаданных файла более гибким в сценариях способом, чем с ls
, большая часть ее функциональности уже была в GNU find
задолго до этого. и с гораздо лучшим интерфейсом, чем у GNU stat
.
Большинство других реализаций stat
могут дать вам время модификации в любом формате, GNU stat
не может (причина, по которой вы в конечном итоге прибегаете к комбинации ls
и GNU date
в вашем вопросе, я полагаю), но GNU find
может (с GNU date
вы также можете использовать date -r " $ file "+% u
).
Выше % T
- время модификации с использованием указанного формата strftime
. % Вт
- день недели в виде числа от 1 (понедельник) до 7.Это лучше в сценариях, чем использование % a
/ % A
, зависящих от локали.
Мы печатаем это число, за которым следует путь к файлу, с разделителями NUL, чтобы можно было обрабатывать имена файлов с символами новой строки, и по конвейеру к sed
, чтобы выбрать записи, начинающиеся с 6
(и удалите для них 6). Затем при выводе NUL переводятся в новую строку.
-z
был добавлен в GNU sed
в 2012 году. Если ваш sed
старше, вы можете изменить приведенное выше значение на:
find . -type f -mtime +10 -printf '%Tu%p\0' |
tr '\0\n' '\n\0'
sed -n 's/^6//p' |
tr '\0' '\n'
Обычно вы не хочу повторять вывод find
, как вы делаете в своем вопросе . Если вы хотите перебрать файлы, найденные с помощью find
в bash
, вам лучше сделать:
while IFS=/ read -d '' -ru3 day file; do
case $day in
(6) printf '"%s" was last modified on a Saturday\n' "$file";;
esac
done 3< <(find . -type f -mtime +10 -printf '%Tu/%p\0')
В zsh
вы также можете сделать:
zmodload zsh/stat # for zsh's stat builtin
last_modified_on_a_saturday() {
local -A stat
stat -LF %u -H stat -- ${1-$REPLY} &&
((stat[mtime] == 6))
}
for file in **/*(ND.m+10+last_modified_on_a_saturday); do
do-something with $file
done
Я использовал неправильный аргумент.
--файл ищет файл.
--В качестве входных данных используется файл.
Так
ausearch --interpret -input /home/user1/audit_shutdown.log
правильно интерпретирует файл