Como encontrar últimos n novos arquivos para cada um dos vários diretórios

0

Estou tentando encontrar maneiras de encontrar os últimos n arquivos mais recentes para vários diretórios.

O problema é que os diretórios são estruturados, mas não são realmente hierárquicos, mas possuem nomes específicos. Exemplo:

./sensor
-./motion
--./2dMotion
---./saved
----./<name>.csv
---./processed
----./<name>.csv
--./3dMotion
---./saved
---./processed
-./temp
--./saved
---./<name>.csv
--./processed

O problema para mim é o seguinte: Eu posso usar a opção -regex no comando find, mas isso pode me fornecer apenas os arquivos mais novos após comandos adicionais para a pesquisa filtrar o arquivo mais recente, mas isso só é válido para o arquivo mais recente o sensor usado.

O que estou tentando alcançar é criar uma saída na qual os últimos n arquivos serão exibidos com base no registro de data e hora.

Como posso fazer isso da maneira mais simples possível?

    
por user217392 30.08.2017 / 15:06

3 respostas

4

Para os 10 últimos arquivos regulares .csv em qualquer diretório saved , em um sistema GNU:

find . -type f -regex '.*/saved/[^/]*\.csv' -printf '%T@:%p
for dir (**/saved(ND/)) {
  newest=($dir/*.csv(D.om[1,10]))
  (($#newest)) && printf '%s\n' $newest
}
' | sort -rnz | awk -v RS='
find . -type f -regex '.*/saved/[^/]*\.csv' -printf '%T@:%p
for dir (**/saved(ND/)) {
  newest=($dir/*.csv(D.om[1,10]))
  (($#newest)) && printf '%s\n' $newest
}
' | sort -rnz | awk -v RS='%pre%' -F/ '{sub(/[^:]*:/, ""); file = $0; NF--} ++n[$0] <= 10 {print file}'
' -F/ '{sub(/[^:]*:/, ""); file = $0; NF--} ++n[$0] <= 10 {print file}'

(os arquivos serão listados do mais novo para o mais antigo).

Com zsh , você também pode fazer algo como:

%pre%     
por 30.08.2017 / 15:39
1
find . -type d -exec bash -c 'echo "next dir: ${1}" ; ls -lt "$1" |
    grep ^- |
    head -n 5' bash {} \;

mais recente da árvore inteira

Isso acabou não sendo a resposta, pois isso fornece os arquivos mais recentes da árvore inteira, mas pode ser útil de qualquer maneira.

find . -type f -printf "%T@ %p\n" |
    sort -nr |
    awk 'NR==6 { exit; } {$1=""; print; }'
    
por 30.08.2017 / 15:27
0

Use ls -lt |grep '^-' |head -n N simplesmente em um loop.

for DIR in /path/to/*; do
if [ -d "$DIR"]; then
    ls -lt "$DIR/*.csv" |grep '^-' |head -n N
fi
done

Onde N é o número de arquivos mais recentes e você pode especificar quantos arquivos serão exibidos no resultado por cada diretório. veja man ls .

    
por 30.08.2017 / 15:12