Se você quiser encontrar arquivos regulares que tenham mais de 10 dias e que tenham sido modificados pela última vez em um sábado (no fuso horário do usuário que está executando o script), com ferramentas GNU (e você parece estar em um GNU sistema como você está usando uma opção específica do GNU para date e o shell GNU), você pode fazer:
find . -type f -mtime +10 -printf '%Tu%pfind . -type f -mtime +10 -printf '%Tu%p 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/%pzmodload 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
')
' |
tr 'find . -type f -mtime +10 -printf '%Tu%pfind . -type f -mtime +10 -printf '%Tu%p 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/%pzmodload 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
')
' |
tr '%pre%\n' '\n%pre%'
sed -n 's/^6//p' |
tr '%pre%' '\n'
' |
sed -zn 's/^6//p' |
tr '%pre%' '\n'
\n' '\n%pre%'
sed -n 's/^6//p' |
tr '%pre%' '\n'
' |
sed -zn 's/^6//p' |
tr '%pre%' '\n'
Embora o GNU tenha adicionado (ainda que diferente) o comando stat no início dos anos 2000 para consultar metadados de arquivo de uma maneira mais scriptável, com ls , a maior parte de sua funcionalidade já estava no GNU find com uma interface muito melhor do que o GNU stat .
A maioria das outras implementações de stat pode dar a você o tempo de modificação em qualquer formato, GNU stat não (o motivo pelo qual você acaba recorrendo a uma combinação de ls e GNU date em sua pergunta I suponha que) mas GNU find pode (com GNU date , você também pode usar date -r "$file" +%u ).
Acima de %T<format-letter> é a hora da modificação usando o formato strftime especificado. %Tu é o dia da semana como um número de 1 (segunda-feira) a 7. Isso é melhor em scripts do que usar %a / %A que são dependentes de localidade.
Estamos imprimindo esse número seguido pelo caminho do arquivo, delimitado por NUL para poder manipular nomes de arquivo com caracteres de nova linha e canalizando para sed para selecionar os registros que começam com 6 (e remover esses 6 para eles). Os NULs são então traduzidos para nova linha na saída.
-z foi adicionado ao GNU sed em 2012. Se o sed for mais antigo, você pode alterar o acima para:
Geralmente, você não deseja repetir a saída de find como na sua pergunta . Se você quisesse fazer um loop pelos arquivos encontrados por find em bash , preferiria fazer:
Em zsh , você também pode fazer: