Classificação de diretórios pela data / hora da última modificação do arquivo contido com o mesmo nome

4

É possível usar grep , find , etc, para classificar uma lista de diretórios pela última data de modificação do arquivo com o mesmo nome (por exemplo, file.php )? Por exemplo:

domain1/file.php (last modified 20-Jan-2014 00:00)
domain2/file.php (last modified 22-Jan-2014 00:00)
domain3/file.php (last modified 24-Jan-2014 00:00)
domain4/file.php (last modified 23-Jan-2014 00:00)

Cada diretório tem o mesmo nome de arquivo (por exemplo, file.php ).

O resultado deve ser:

domain3/ (last modified 24-Jan-2014 00:00)
domain4/ (last modified 23-Jan-2014 00:00)
domain2/ (last modified 22-Jan-2014 00:00)
domain1/ (last modified 21-Jan-2014 00:00)
    
por user88922 23.10.2014 / 16:27

4 respostas

5

Como Vivian sugeriu, a opção -t de ls diz para classificar arquivos por hora de modificação (mais recente primeiro, por padrão; invertido se você adicionar -r ). Isso é mais comumente usado (pelo menos na minha experiência) para classificar os arquivos em um diretório, mas também pode ser aplicado a uma lista de arquivos na linha de comando. E curingas (“globs”) produzem uma lista de arquivos na linha de comando. Então, se você disser

ls -t */file.php

listará

domain3/file.php  domain4/file.php  domain2/file.php  domain1/file.php

Mas, você adiciona a opção -1 (traço um) ou canaliza isso para qualquer coisa, ele irá listá-los um por linha. Então o comando que você quer é

ls -t */file.php | sed 's|/file.php||'

Este é um ordinário s/old_string/replacement_string/ de substituição em sed , mas usando | como delimitador, porque o old_string contém / , e com um vazio replacement_string . (Isto é, exclui o nome do arquivo e o / antes dele - /file.php - da saída ls .) Claro, se você quiser o / à direita nos nomes dos diretórios, faça apenas sed 's|file.php||' ou sed 's/file.php//' .

Se desejar, adicione a opção -l (letra minúscula L) a ls para obter a listagem longa, incluindo a data / hora da modificação. E então você pode querer melhorar o comando sed para remover informações irrelevantes (como o modo, o proprietário e o tamanho do arquivo) e, se quiser, mova a data / hora após o nome do diretório.

Isto irá procurar nos diretórios que estão no diretório atual, e somente eles. (Isso parece ser o que a pergunta está pedindo.) Fazer uma varredura de um nível de algum outro diretório é uma variação trivial:

ls -t /path/to/tld/*/file.php | sed 's|/file.php||'

Para (recursivamente) pesquisar toda a árvore de diretórios em seu diretório atual (ou algum outro diretório de nível superior) é um pouco mais complicado. Digite o comando

shopt -s globstar

e, em seguida, substitua o asterisco ( * ) em um dos comandos acima por dois asteriscos ( ** ), por exemplo,

ls -t **/file.php | sed 's|/file.php||'
    
por 23.10.2014 / 17:28
1

Sim, é bem possível.

Isso fornecerá arquivos que foram modificados nos últimos 60 minutos:

$ find /domain -type f -mmin -60

ou isso fornecerá arquivos que são classificados por tempo de modificação.

$ find /domain -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r

Editar # 1

Se você tem extensões de arquivo como você disse '.php', adicione isto:

-name '*.php'

E eu encontrei isso você pode querer ver.

Editar # 2

Bem, sua última edição dificulta as coisas. Mas você pode usar ls -t para os últimos diretórios modificados e se você quiser classificar pelo tempo ls -clRt você poderia usá-lo e depois disso você pode verificar os arquivos, mas não tenho certeza do que você quer com um comando específico. É possível com um script semelhante (Bash ou Perl).

    
por 23.10.2014 / 16:36
1

Isso faz quase exatamente o que você quer, exceto que deixa de fora os nomes dos diretórios.

find . -maxdepth 2 -name file1.php -printf '%T@ %h (last modified %Td/%Tm/%TY %Tk:%TM)\n' \
| sort -k 1n | sed 's/^[^ ]* .\///'

Crédito onde o crédito é devido. Isso é adaptado da resposta do aqui .

Editar: todos os meus% A devem ter sido% T

    
por 23.10.2014 / 17:27
0

com zsh :

setopt extendedglob
print -rl -- **/file.php(.om:h)

.om classifica os arquivos selecionados por mtime e :h remove o componente do caminho à direita.
Se você quiser listar mtime s também, você pode usar zstat :

zmodload zsh/stat
for f (**/file.php(.om))
printf '%s %s\t%s\n' $(zstat -F '%d-%b-%Y %T' +mtime -- $f) ${f:h}
    
por 11.08.2015 / 00:12