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

0

Eu tenho um dir em

Meu diretório principal é /tmp/folder

Dentro de /tmp/folder existem 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 muitos arquivos da mesma extensão. Eu quero de cada uma dessas pastas, para obter o último & primeiros arquivos criados (tempo modificado).

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 desejada, mas faça isso de maneira amigável para que eu possa analisá-la facilmente.

O comando bash deve ser apenas 1

    
por OhGodWhy 07.11.2015 / 17:43

1 resposta

1
find "$DIR" -type d | while read d; do echo "$d,$(ls -t "$d" | sed -n '1h; $ { G; s/\n/,/g; p }')"; done

Ou, em 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 localiza todos os subdiretórios de $DIR usando o comando find . Para cada um encontrado, usa ls -tr para obter uma lista de arquivos nesse diretório classificados por data, o mais novo primeiro.

Canalize a saída de ls -tr para sed unindo 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 novo) na retenção espaço , e na última linha do arquivo (selecionada por $ ) acrescenta o espaço de espera (nome do arquivo mais novo) com H ao espaço padrão (delimitado por uma nova linha) e altera essa nova linha para um vírgula.

O script então printf s o nome do subdiretório seguido por uma vírgula, seguido pelos arquivos que saíram de sed .

Isso não faz distinção entre diretórios e arquivos para a seleção mais antiga / mais nova, então se você não quiser diretórios lá, você precisará filtrar a saída de ls -t para remover os diretórios.

    
por 07.11.2015 / 18:02

Tags