O POSIX tem a dizer sobre datas em uma ls -llistagem 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 -qopção também especificada no POSIX , é relativamente fácil preparar uma regex para um lsresultado sem find:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
greppara 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
-qretorna o shell glob em ?vez de caracteres não imprimíveis ou \tab em um nome de arquivo
Esses resultados são passados sobre o |pipearquivo ao sedqual 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 dpara 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 croncurso, 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+ lsenvolve várias invocações - isso envolve apenas um único lsprocesso, e é por isso que ele é capaz de classificar tudo de maneira confiável - o que faz por padrão - e sorttambém é tornado auxiliar.
Qualquer solução que envolva finde sorte lsestá praticamente fazendo tudo do trabalho duas vezes. lse findambos resolverão todos os nomes de caminhos e statarquivos. lse sortambos classificarão todos os resultados. Provavelmente é melhor usar apenas o single ls.
Então, naturalmente, há o datee sedpartes 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 à datestring pela qual estamos pesquisando, grepmas 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 **/*(.)