Script de shell para mesclar arquivos com os mesmos nomes

2

Eu tenho um diretório de arquivos como:

file.1111111_1.pdf
file.1111111_2.pdf
file.2222222_1.pdf
file.2222222_2.pdf
…
file.1234567_1.pdf
file.1234567_2.pdf
…
file.aaaaaaa_1.pdf
file.aaaaaaa_2.pdf
…
file.abcdefg_1.pdf
file.abcdefg_2.pdf

Como eu posso mesclar o primeiro 7digit mesmo nome de arquivo para novo arquivo no mesmo diretório ou subdiretório, ele deve acabar assim:

file.1111111.pdf
file.2222222.pdf
…
file.1234567.pdf
…
file.aaaaaaa.pdf
…
file.abcdefg.pdf
    
por Somchay Tongkam 30.09.2014 / 02:12

2 respostas

3

Existem muitas ferramentas para mesclar arquivos pdf, uma delas é pdfunite . Simples one-liner para fazer o que você precisa com esta ferramenta se parece com isso:

for file in file.*_*.pdf; do [[ -e ${file%_*}.pdf ]] && \
    continue || pdfunite ${file%_*}_*.pdf ${file%_*}.pdf; done

Eu uso o mecanismo de expansão de parâmetros ${file%_*} para remover sufixo padrão _* do nome do arquivo correspondente e crie ${file%_*}.pdf como o arquivo de saída.

    
por 30.09.2014 / 02:44
0

Aqui está um exemplo rápido usando o comando 'convert':

$ ls
files.txt  TEST.pdf

TEST.pdf é um Adobe PDF que obtive de aqui . É apenas um exemplo que usei para preencher o resto dos seus nomes de arquivos.

Os nomes dos seus arquivos estão em files.txt

$ cat files.txt 
file.1111111_1.pdf file.1111111_2.pdf file.2222222_1.pdf file.2222222_2.pdf file.1234567_1.pdf file.1234567_2.pdf file.aaaaaaa_1.pdf file.aaaaaaa_2.pdf file.abcdefg_1.pdf file.abcdefg_2.pdf

Usando este arquivo, eu gero meus dados de teste:

$ for i in $(<files.txt); do cp TEST.pdf $i; done

$ ls
file.1111111_1.pdf  file.1234567_1.pdf  file.2222222_1.pdf  file.aaaaaaa_1.pdf  file.abcdefg_1.pdf  files.txt
file.1111111_2.pdf  file.1234567_2.pdf  file.2222222_2.pdf  file.aaaaaaa_2.pdf  file.abcdefg_2.pdf  TEST.pdf

Agora podemos percorrer todos os arquivos que correspondem à estrutura do seu nome. Em seguida, coloque-os em um subdiretório apropriado. Em seguida, usamos o comando 'converter' para mesclar esses PDFs em um único arquivo.

$ for pdf in $(ls *.*_*.pdf); do base=$(echo $pdf | cut -d_ -f1) ; \
    [[ -d $base ]] || mkdir $base ; mv $pdf $base/ ; \
    convert $base/*_*.pdf $base/$base.pdf ; done

$ ls
file.1111111  file.1234567  file.2222222  file.aaaaaaa  file.abcdefg  files.txt  TEST.pdf

$ ls file.1111111/ 
file.1111111_1.pdf  file.1111111_2.pdf  file.1111111.pdf

file.11111111.pdf no subdiretório é seu arquivo mesclado.

    
por 30.09.2014 / 03:01