mesclar arquivos em diretórios diferentes executando um script no terminal

0

Eu sou novo no UBUNTU. Como posso mesclar arquivos em diretórios diferentes? Usar o gato para mesclá-los é uma tarefa meticulosa. É a única maneira que conheço. Desde já, obrigado, Saikat

    
por Saikat 21.08.2015 / 11:24

1 resposta

1

Ao ter arquivos de texto simples, você pode mesclá-los sem dificuldades usando o operador >> . Ele adicionará a saída do comando anterior ao final do arquivo especificado depois.

Procedimento básico (não para muitos arquivos)

Exemplo:

Imagine uma estrutura de diretórios como esta:

parent
 |--a
 |  \--first.txt
 \--b
    \--second.txt

Agora, os conteúdos de a/first.txt são

Hello! This is my first Textfile.
   ~~some lines~~
end

e b/second.txt contêm

    ///////////////////
   //               //
  //  second file  //
 //               //
///////////////////

Para que possamos mesclá-lo digitando:

$ touch merge.txt
$ cat a/first.txt >> merge.txt
$ cat b/second.txt >> merge.txt

Um novo arquivo vazio merge.txt no diretório atual será criado e o conteúdo dos arquivos será adicionado sem sobrescrever, como > faria.

merge.txt agora contém:

Hello! This is my first Textfile.
   ~~some lines~~
end
    ///////////////////
   //               //
  //  second file  //
 //               //
///////////////////

Feito!

Script avançado (para cobrir muitos arquivos em diretórios diferentes)

Se você tiver mais de dez arquivos, talvez até mesmo em dez diretórios diferentes, poderá criar um script bash e deixar que o computador faça toda a seleção e cópia por conta própria. Se você é completamente novo em bash ou shell script, eu recomendo que você leia um pouco antes sobre o que é capaz e obtenha uma compreensão básica da aparência de variáveis e loops, para que você não fique muito confuso.

Estou usando o topo do link como referência agora. Nosso script será basicamente assim:

#!/bin/bash

FILES="file1
/path/to/file2"

OUTPUT="merge.txt"

for f in $FILES
do
    cat $f >> $OUTPUT
done

(Oh, espero que isso funcione)

Se todos os seus arquivos compartilharem algo que os diferencie de outros arquivos que não queremos mesclar, é exatamente disso que precisamos. Idealmente, eles compartilham uma pasta comum de pai ou mãe, onde você não pode encontrar nenhum outro arquivo além do nosso. Então, podemos simplesmente usar /the/path/to/that/folder/* como seletor ao definir nossa variável $FILES . Como você vê no modelo, podemos definir vários seletores. Espero que você não se importe muito com a ordem em que os arquivos serão selecionados automaticamente, caso contrário, teremos que pensar em alguma maneira de especificar isso ... Para nosso exemplo acima, poderíamos definir:

FILES="*/*" ou FILES="*/*.txt" ou FILES="a/* b/*" ou mais e OUTPUT="merge.txt" , claro.

Algumas últimas reflexões

Talvez seja necessário prestar atenção ao não selecionar nosso arquivo de mesclagem com "*" , o que pode ser um pouco estranho ... Acima, portanto, incluímos um / everytime. Você também pode simplesmente colocá-lo em outro lugar.

Se seus arquivos seguirem um padrão, como p_some-thing-axy-1 , p_some-thing-axy-1 , p_some-thing-bxz-1 , você poderá escolher algum seletor como p_some-thing-* ou mais.

Agora, espero que você possa fazer algum uso disso, porque eu estou fora.

Boa sorte! : D

    
por Peter Nerlich 21.08.2015 / 12:19