O POSIX tem a dizer sobre datas em uma ls
-l
listagem ong:
O <date and time>
campo deve conter a data e o carimbo de data e hora apropriados de quando o arquivo foi modificado pela última vez. No código do idioma POSIX, o campo deve ser equivalente à saída do seguinte comando date:
date "+%b %e %H:%M"
... se o arquivo foi modificado nos últimos seis meses ou:
date "+%b %e %Y"
Levando isso em consideração e assegurando que, se houver novas linhas em um nome de arquivo, elas sejam devidamente preenchidas com a ls -q
opção também especificada no POSIX , é relativamente fácil preparar uma regex para um ls
resultado sem find
:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grep
para isso e você retornará apenas linhas que contenham as seqüências que representam as datas de hoje ou de ontem. O seguinte comando adiciona um pouco a isso:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls
opções consistem em:
-a
retornar todos os arquivos em um diretório - incluindo aqueles que começam com um .dot
-l
lista longa
-R
listar recursivamente todos os diretórios filhos
-c
tempo de modificação da tela em vez do tempo de acesso
-q
retorna o shell glob em ?
vez de caracteres não imprimíveis ou \t
ab em um nome de arquivo
Esses resultados são passados sobre o |pipe
arquivo ao sed
qual corresponde apenas:
- A linha em branco que precede o nome do caminho e a seguinte linha
- Linhas começando com
-
(em outras palavras - não d
para diretório) que também contêm o seu date
.
- No entanto, ele não imprime as linhas do nome do caminho, a menos que o diretório que eles nomeiem contenha arquivos para os quais você filtrou.
A saída é assim:
ls -alRcq --color=always |
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv 2086 Jul 4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv 2657 Jul 4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv 681 Jul 5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul 5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul 4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul 4 13:34 shot-2014-06-22_17-11-06.jpg
./.cache/efreet:
-rw------- 1 mikeserv mikeserv 37325 Jul 4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv 37325 Jul 4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 16037 Jul 4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv 3117 Jul 4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul 4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv 18589 Jul 4 23:30 icons_hicolor_localhost.eet
./.config:
-rw-r--r-- 1 mikeserv mikeserv 30 Jul 4 19:10 pavucontrol.ini
./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul 4 13:36 conf.tar.lz4.bak
Sim, ele ainda funciona com LS_COLORS
- o que provavelmente é uma baixa prioridade para o seu cron
curso, mas, ei, suas opções estão abertas.
De qualquer forma, isso oferece algumas vantagens significativas em relação a outras soluções possíveis.
Em primeiro lugar, o find
+ ls
envolve várias invocações - isso envolve apenas um único ls
processo, e é por isso que ele é capaz de classificar tudo de maneira confiável - o que faz por padrão - e sort
também é tornado auxiliar.
Qualquer solução que envolva find
e sort
e ls
está praticamente fazendo tudo do trabalho duas vezes. ls
e find
ambos resolverão todos os nomes de caminhos e stat
arquivos. ls
e sort
ambos classificarão todos os resultados. Provavelmente é melhor usar apenas o single ls
.
Então, naturalmente, há o date
e sed
partes desta resposta. O importante é notar que você faz a parte mais difícil e obtém o regex primeiro - e apenas uma vez - e depois remove apenas uma única lista de resultados, em vez de dizer, obter resultados, obter resultados, classificar resultados e classificar resultados.
Isso não quebra nos nomes de arquivos que contêm novas linhas, como provavelmente outras soluções. Essa solução tem suas próprias advertências - que explico a seguir -, mas são minuciosas e fáceis de manusear. Na minha opinião, esta é a solução mais robusta aqui.
Há dois casos em que o comando acima pode causar problemas. O primeiro envolve os ?
globs nos nomes de arquivos - enquanto já é uma solução mais robusta do que qualquer outro oferecido aqui, e a probabilidade de você encontrar um ?
é pequena o suficiente por si só, existe a possibilidade de resolver esses globs pode corresponder a mais de um nome de arquivo. Por favor, veja isto para mais informações sobre este assunto.
A outra possibilidade envolve um falso positivo - por exemplo, se você tiver um nome de arquivo que realmente corresponda à date
string pela qual estamos pesquisando, grep
mas que não foi realmente modificada em nenhum desses dias. Não estou contando que isso seja um problema, mas, se for, pergunte sobre isso e provavelmente posso ajudá-lo a tornar o regex mais específico para lidar com isso.
ls -ls **/*(.)