É possível a saída find … -exec ls -ls ;
ordenada alfabeticamente, por nome de arquivo?
Este é o meu comando cron:
find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;
Este comando funciona bem, na maior parte. Mas os resultados não são classificados em nenhuma sequência significativa. Seria muito útil se eles fossem classificados pelo campo de nome do arquivo.
ls -ls **/*(.)
ls
iria classificar.Respostas:
Presumo que seus nomes de arquivos não contenham novas linhas.
Usar em
+
vez de;
para finalizar a-exec
ação a torna mais rápida, agrupando as chamadas dels
. Você pode classificar através dosort
comando; diga para começar a classificar no 10º campo (os 9 primeiros são os metadados: blocos, permissões, contagem de links, usuário, grupo, tamanho e 3 campos de data / hora). A opção-n
informals
para usar valores numéricos para o usuário e grupo, o que evita o risco de nomes de usuários ou grupos que contenham espaços em branco.Como alternativa, com o zsh, você pode sair sem assumir nenhum nome usando qualificadores glob para coletar e classificar os arquivos e
zargs
executarls
várias vezes se a linha de comando for muito longa. Você precisa do GNUls
(especificamente sua-f
opção) para evitar a re-classificaçãols
(outra abordagem seria emularls
com o zshzstat
).fonte
Por que não canalizar o resultado da busca através da classificação e depois executar ls para cada uma das linhas?
fonte
O POSIX tem a dizer sobre datas em uma
ls
-l
listagem ong: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 umls
resultado semfind
: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
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 arquivoEsses resultados são passados sobre o
|pipe
arquivo aosed
qual corresponde apenas:-
(em outras palavras - nãod
para diretório) que também contêm o seudate
.A saída é assim:
Sim, ele ainda funciona com
LS_COLORS
- o que provavelmente é uma baixa prioridade para o seucron
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 únicols
processo, e é por isso que ele é capaz de classificar tudo de maneira confiável - o que faz por padrão - esort
também é tornado auxiliar.Qualquer solução que envolva
find
esort
els
está praticamente fazendo tudo do trabalho duas vezes.ls
efind
ambos resolverão todos os nomes de caminhos estat
arquivos.ls
esort
ambos classificarão todos os resultados. Provavelmente é melhor usar apenas o singlels
.Então, naturalmente, há o
date
esed
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.fonte
Você pode realmente usar uma combinação de find, xargs e ls.
Aqui está um comando de amostra:
find . -type f -print0 | xargs -0 ls -lt
find
procurará recursivamente todos os arquivos no diretório atual.ls
comando em uma única chamada (desde quefind
retorne menos que osARG_MAX
arquivos).ls -lt
classificará esses arquivos por hora e formatará a saídaPara recuperar seu sistema,
ARG_MAX
você pode digitar:fonte
fonte
ls
faz sua própria classificação, assim canalizando a saída dofind
meiosort
é inútil. Além disso, seu comando gerencia nomes de arquivos que contêm espaços em branco (entre outros) e falhará se houver muitos nomes de arquivos.