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).
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?
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).
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 Tags command-line ls find sed