Quero listar todos os arquivos (classificados por data) mais recentes que o carimbo de data / hora no formato 20130207003851
somente no diretório / tmp. Os subdiretórios podem ser omitidos.
Usando o SUSE Linux Enterprise Server 11.
O formato de saída deve ser
S0002948.LOG Feb 7 03:28
S0002935.LOG Feb 7 05:58
S0002952.LOG Feb 7 09:58
S0002940.LOG Feb 7 11:58
find / tmp -newermt "7 de fevereiro de 2013" -ls lista os arquivos que eu quero, mas
- como posso usar o registro de data e hora em um formato 20130207003851
- como posso classificar a saída?
- como posso exibir apenas o nome e a data do arquivo. Nome do arquivo primeiro e depois a data?
ps Eu não quero usar o touch para criar um arquivo de referência para encontrar
pss
find -newermt "20130207003851" -ls
find: I cannot figure out how to interpret `20130207003851' as a date or time
shell-script
find
ls
timestamps
Radek
fonte
fonte
2013007000385
deveria representar? Eu acho que 2013 é o ano, mas como você vai007000385
para 7 de fevereiro?20130207003851
. Não copiou corretamente ou ... desculpe por isso.Respostas:
find
suporta muitos formatos de entrada de data . O formato mais simples de obter é AAAAMMDD HH: MM: SS. Você já tem os dígitos na ordem correta, tudo o que você precisa fazer é extrair o primeiro grupo (${timestamp%??????}
: pegar todos os últimos 6 caracteres;${timestamp#????????}
pegar todos os 8 primeiros), e continuar, acrescentando pontuação e depois o próximo grupo como você vai junto.No bash (e ksh e zsh), mas não no ash, você pode usar a
${STRING_VARIABLE:OFFSET:LENGTH}
construção mais legível .Para classificar os arquivos por data, imprima os nomes dos arquivos precedidos pelas datas e classifique-os e retire o prefixo da data. Use
-printf
para controlar o formato de saída. imprime uma parte do tempo de modificação determinado por ; se for , você obtém o número de segundos desde a época do Unix. Abaixo, imprimo três colunas separadas por tabulação: a hora no formato classificável, o nome do arquivo e a hora no formato legível por humanos; remove a primeira coluna e a chamada para substituir a guia por espaços suficientes para acomodar todos os nomes de arquivos esperados (ajuste 40 conforme desejado). Este código pressupõe que você não tenha novas linhas ou guias nos nomes dos arquivos.%TX
X
X
@
cut -f 2-
expand
fonte
find -newermt "$timestring" -printf '%M@\t%f %Mb %Md %MH:%MM\n'
me dá saída engraçado-rwxrwxrwx@ S0002975.LOG -rwxrwxrwxb -rwxrwxrwxd -rwxrwxrwxH:-rwxrwxrwxM
%T
para o mtime,%M
são as permissões.find /tmp -maxdepth 1 -type f -newermt "20130207 00:38:51" -printf '%T@\t%f-%Tb %Td %TH:%TM\n' | sort -k1n | cut -f 2-
eu separei o nome e o tempo do arquivo-
porque capturarei a saída em php e usarei - como separador. Muito obrigado.Com
zsh
:Os
newer
função retorna TRUE para arquivos mais novos que$timestamp
(nota quezsh
'szstat
não suporta a precisão subsecond embora).Então, tudo o que fazemos é usar
zsh
qualificadores de globbing:D
para incluir arquivos de ponto,.
considerar apenas arquivos regulares,Om
solicitar tempo de modificação e+newer
chamar anewer
função para determinar qual arquivo selecionar.Se você deseja exibir também os carimbos de data e hora do arquivo, é possível alterar
newer
para:Observe que o resultado da geração do nome do arquivo incluirá os carimbos de data e hora, o que significa que você não pode mais usá-los como nomes de arquivos.
fonte
ssh
, por exemplo.