Comando Bash para obter o primeiro e o último arquivo de cada pasta recursiva

Comando Bash para obter o primeiro e o último arquivo de cada pasta recursiva

Eu tenho um diretório em

Meu DIR principal é/tmp/folder

Dentro /tmp/folderhá 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 $DIRuso do findcomando. Para cada um encontrado, é usado ls -trpara obter uma lista de arquivos naquele diretório classificados por data, os mais recentes primeiro.

Canalize a saída de ls -trjuntando seda primeira e a última linha com uma vírgula: a opção -nsuprime a saída padrão, 1hsalva 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 Hespaç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 -tpara remover os diretórios.

informação relacionada