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: