bash lista de arquivos arquivados com curinga em loop

2

Eu tenho alguns milhares de arquivos de texto gzipped em subdiretórios diferentes e usei um subconjunto desses arquivos como entrada para um projeto há alguns anos. Naquela época eu tinha uma cópia descompactada dos arquivos que eu realmente usei em um diretório, mas apaguei isso e mantive apenas uma lista desses arquivos descompactados naquela pasta

Esta foi a minha ideia inicial, LIST é a lista de arquivos. PARENTDIR é o diretório de nível superior no qual todos os arquivos residem em vários subdiretórios. A ideia era encontrar todos os arquivos em qualquer sub-diretório que eles fossem e gunzip-los para NEWDIR

#!/usr/bin/env bash    

LIST="listfile.txt"
PARENTDIR="/home/user/old/project"
NEWDIR="/home/user/old/project/2016"

while read line;
do
    ARCHIVE="$(find $PARENTDIR -name "$line*")"
    gunzip --stdout $ARCHIVE >$NEWDIR/$line
done <$LIST

Parece que não consigo acertar o comando de localização. Ele funciona sem as variáveis, mas não com, mesmo sem a substituição do comando, chamando na linha de comando. Minha combinação de citações e curingas não está correta, mas não consigo acertar, a expansão de variáveis também não ajuda e acho que estou presa ...

    
por Carambakaracho 29.06.2016 / 09:51

1 resposta

1

Pensei em usar a opção -exec para find , mas isso não funcionaria devido ao operador de redirecionamento usado com o comando gunzip . Uma solução seria executar a operação em duas etapas:

1. Copie os arquivos em $NEWDIR :

    while read line
    do
        find "$PARENTDIR" -name "$line*" -exec cp -v {} "$NEWDIR" \;
    done < "$LIST"

Isso deve funcionar com as versões compatíveis com POSIX de find - não apenas o GNU encontrar .

Evite a gravação excessiva de arquivos com nomes semelhantes

Se você tiver nomes de arquivos duplicados, eles serão substituídos em $NEWDIR . Se vocês Se você quiser evitar a gravação excessiva dos arquivos, precisará recriar o diretório árvore dentro de $NEWDIR . Isso pode ser feito usando o comando install de GNU coreutils que cria todas partes do caminho similar a mkdir -p .

    cd "$NEWDIR"
    while read line
    do
        find . -name "$line*" -exec install -D {} $NEWDIR/{} \;
    done < "$LIST"
    cd -

2. Descompacte os arquivos copiados:

    find "$NEWDIR" -exec gunzip {} \;
    
por 29.06.2016 / 11:01