Como listar apenas a última linha de cada diretório?

1

Aprendi graças a você como exibir apenas a última linha de uma listagem, por exemplo,

ls -ltr | sed '$!d'

Agora eu pensei, como combiná-lo com o comando find, para repetir isso em cada saída de diretório, mas só cheguei a uma solução falsa:

find / -type d | xargs ls -ltr | sed '$!d'

Se eu o ler corretamente, isso não exibirá a última linha de cada diretório, mas apenas a última linha de todas as listagens de todos os diretórios.

Como fazer isso certo?

    
por Abdul Al Hazred 26.03.2015 / 23:40

2 respostas

2

Eu usaria esse tipo de construção como ponto de partida

find / -type d -print0 | xargs -0 -I'{}' sh -c 'ls -ltr {} | tail -1'

Advertência: não gosta de diretórios vazios ( total 0 é a saída).

    
por 26.03.2015 / 23:52
2

Provavelmente isso seria melhor: combinação de find e shell

find / -type d -print0 | while read -r -d '' dir; do 
    ls -ltr "$dir" | sed '$!d'
done

find produzirá cada diretório encontrado, usando o byte nulo em vez de uma nova linha para separá-los. Esse fluxo é alimentado em um loop while , usando read -d '' para extrair cada nome de diretório delimitado por nulo. Em seguida, para cada diretório, todas, exceto a última linha de ls output, serão excluídas por sed .

A chave é que o loop while itera sobre cada nome de diretório, portanto, o arquivo mais recente é encontrado para cada diretório.

Um grande problema com isso é que ls -l output não mostra o nome do diretório, então a saída provavelmente não fará muito sentido - você vê arquivos, mas sem saber em qual diretório eles aparecem.

Para encontrar o arquivo mais novo em cada diretório, eu faria isso:

find . -type f -printf "%h:%T@:%p\n" |
sort -t: -k1,1r -k2,2nr |
awk -F: '!seen[$1]++ {print $3}'
  • find para obter o diretório, mod time e nome do caminho
  • sort para agrupar por diretório e classificar por hora
  • awk para imprimir o nome do caminho que é o primeiro para cada diretório
por 26.03.2015 / 23:52