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||'