
Eu tenho um diretório em
Meu DIR principal é/tmp/folder
Dentro /tmp/folder
há apenas um número X de pastas (não arquivos). Por exemplo
/tmp/folder/1
/tmp/folder/2
/tmp/folder/3
/tmp/folder/4
/tmp/folder/5
Dentro dessas pastas existem vários arquivos da mesma extensão. Quero de cada uma dessas pastas obter os últimos e primeiros arquivos criados (hora modificada).
A saída eu prefiro ser assim
/tmp/folder/1,OLD_FILE,NEW_FILE
/tmp/folder/2,OLD_FILE,NEW_FILE
/tmp/folder/3,OLD_FILE,NEW_FILE
/tmp/folder/4,OLD_FILE,NEW_FILE
/tmp/folder/5,OLD_FILE,NEW_FILE
Analisarei essa saída usando um script, para que você possa fazer qualquer saída que desejar, mas faça-o de maneira amigável para que eu possa analisá-la facilmente.
O comando bash deve ser apenas 1
Responder1
find "$DIR" -type d | while read d; do echo "$d,$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')"; done
Ou, num formato mais legível e usando uma variável extra para demonstração:
find "$DIR" -type d |
while read d;
do
files=$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')
printf '%s,%s\n' "$d" "$files";
done
Isso encontra todos os subdiretórios de $DIR
uso do find
comando. Para cada um encontrado, é usado ls -tr
para obter uma lista de arquivos naquele diretório classificados por data, os mais recentes primeiro.
Canalize a saída de ls -tr
juntando sed
a primeira e a última linha com uma vírgula: a opção -n
suprime a saída padrão, 1h
salva a primeira linha (nome do arquivo mais recente) nomantenha espaço, e na última linha do arquivo (selecionado por $
) anexa o espaço de espera (nome do arquivo mais recente) ao H
espaço padrão (delimitado por uma nova linha) e altera essa nova linha para uma vírgula.
O script então printf
é o nome do subdiretório seguido por uma vírgula, seguido pelos arquivos que saíram do arquivo sed
.
Isso não faz distinção entre diretórios e arquivos para seleção mais antiga/mais recente, portanto, se você não quiser diretórios lá, precisará filtrar a saída de ls -t
para remover os diretórios.