Como pesquisar um arquivo com base no dia da semana

6

Na verdade, preciso pesquisar arquivos e pastas criados em 2012 na sexta-feira de cada mês.

Eu fiz algumas tentativas usando o comando find , mas não funcionou.

    
por OmiPenguin 11.02.2013 / 11:29

2 respostas

7

A maneira mais simples com find é:

find / -daystart -mtime +41 -mtime -408 \
  -printf "%M %n %u %g %10s %TY-%Tm-%Td %Ta %TH:%TM:%TS %h/%f\n" |
awk '($7=="Fri"){print}'

Ajuste o -printf , conforme necessário, e fiz com que parecesse próximo de ls -l aqui. %T (e %A %C ) permitem usar a formatação strftime() para registros de data e hora, sendo %Ta o dia da semana. (Pode ser necessário ajustar os intervalos de dias de 41 a 408, mas isso é apenas uma otimização, você pode apenas grep 2012 ou ajustar -printf para facilitar o grep.)

Editar: uma versão mais robusta, com uma ligeira perda de clareza:

find / -daystart -mtime +41 -mtime -408 \
   -printf "%M %n %u %g %10s %TY-%Tm-%Td %Ta %TH:%TM:%TS
find / -daystart -mtime +41 -mtime -408 \
  -printf "%M %n %u %g %10s %TY-%Tm-%Td %Ta %TH:%TM:%TS %h/%f\n" |
awk '($7=="Fri"){print}'
%h/%f
find / -daystart -mtime +41 -mtime -408 \
   -printf "%M %n %u %g %10s %TY-%Tm-%Td %Ta %TH:%TM:%TS%pre%%h/%f%pre%%pre%" |
gawk 'BEGIN{RS="%pre%%pre%"; FS="[%pre%]"} ($1~/ Fri /) { printf $2 "%pre%"}' | 
xargs -0 -n 1 -i ls -l "{}"
%pre%" | gawk 'BEGIN{RS="%pre%%pre%"; FS="[%pre%]"} ($1~/ Fri /) { printf $2 "%pre%"}' | xargs -0 -n 1 -i ls -l "{}"

Isso emula -print0 , mas cada linha tem dois campos delimitados por ls -l "{}" , sendo o nome do arquivo o segundo. Substitua gawk no final com o que você precisa fazer no (s) arquivo (s). Estou explicitamente usando RS , outros awks não são tão gentis com \ 0 bytes em FS / %Tu (atualizados para lidar com novas linhas em nomes de arquivos também).

Além disso, conforme sugerido por mreithub , você pode usar %Ta , bem como, ou em vez de %code% para um dia da semana numerado, uma opção independente de idioma.

    
por 11.02.2013 / 11:43
0

Com gnu tools:

find . -exec bash -c '[[ $(date -r "$0" +%u%Y) = "52012" ]]' {} \; -print

os nomes de arquivos / diretórios são -print ed somente se o% anterior-exec retornou verdadeiro , ou seja, se mtime informado por date -r no formato especificado ( %u%Y ) é 52012

Ou, se você preferir uma solução zsh -only (é bastante semelhante, o e -string seleciona apenas os arquivos / diretórios para os quais a expressão dentro das aspas retorna true ):

zmodload zsh/stat
print -rl -- **/*(De_'[[ $(zstat -F "%u%Y" +mtime -- $REPLY) = "52012" ]]'_)
    
por 17.02.2016 / 14:36