Respostas:
Use o redirecionamento interno do bash (tldp) :
cat file2 >> file1
sudo
o cat
comando (e inserir credenciais, se solicitado).
tee
programa: cat 1 | tee -a 2 3
. Você pode colocar quantos arquivos desejar após a troca --append
(ou -a
abreviação).
cat file2 >> file1
O >>
operador anexa a saída ao arquivo nomeado ou cria o arquivo nomeado se ele não existir.
cat file1 file2 > file3
Isso concatena dois ou mais arquivos para um. Você pode ter quantos arquivos de origem for necessário. Por exemplo,
cat *.txt >> newfile.txt
Atualização 20130902
Nos comentários, eumiro sugere "não tente cat file1 file2 > file1
". A razão pela qual isso pode não resultar no resultado esperado é que o arquivo que recebe o redirecionamento é preparado antes da >
execução do comando à esquerda do . Nesse caso, primeiro file1
é truncado para comprimento zero e aberto para saída, então o cat
comando tenta concatenar o arquivo agora com tamanho zero mais o conteúdo de file2
into file1
. O resultado é que o conteúdo original file1
é perdido e, em seu lugar, é uma cópia da file2
qual provavelmente não é o esperado.
Atualização 20160919
Nos comentários, o tpartee sugere um link para informações / fontes de backup. Para uma referência autorizada, direciono o leitor gentil para a página de manual sh no linuxcommand.org, que afirma:
Antes de um comando ser executado, sua entrada e saída podem ser redirecionadas usando uma notação especial interpretada pelo shell.
Embora isso diga ao leitor o que ele precisa saber, é fácil perder se você não estiver procurando por ele e analisando a afirmação palavra por palavra. A palavra mais importante aqui é 'antes'. O redirecionamento é concluído (ou falha) antes da execução do comando.
No caso de exemplo do cat file1 file2 > file1
shell, o redirecionamento é executado primeiro para que os identificadores de E / S estejam no local no ambiente em que o comando será executado antes de ser executado.
Uma versão mais amigável na qual a precedência de redirecionamento é abordada extensivamente pode ser encontrada no site de Ian Allen na forma de material didático do Linux. Sua página de notas de redirecionamento de E / S tem muito a dizer sobre o tópico, incluindo a observação de que o redirecionamento funciona mesmo sem um comando. Passando isso para o shell:
$ >out
... cria um arquivo vazio nomeado. O shell primeiro configura o redirecionamento de E / S, depois procura um comando, não encontra nenhum e conclui a operação.
cat file1 file2 > file1
- isso não funcionará como você provavelmente está esperando.
>>
o que irá modificar o arquivo file1
. T.Rob fez um trabalho muito superior ao explicar sua resposta, em vez de apenas correr para enviar algo que, de fato, estava incorreto. Com base no texto da pergunta, acredito que esse cat file1 file2 > file3
é o comando apropriado que o @asir estava procurando.
>
é executada primeiro. Portanto, a execução cat file1 file2 > file1
primeiro atrapalha e file1
depois tenta copiar o arquivo agora com tamanho zero para si mesmo. Isso faz sentido quando você pensa na ordem em que as operações podem e devem ocorrer, mas é sutil o suficiente para pegar muitas pessoas de surpresa. Então, se nada mais, eumiro e você solicitaram uma melhoria adicional na resposta. Obrigado por isso!
>>
anexa ao arquivo e o >
substitui .
Nota : se você precisar usar o sudo , faça o seguinte:
sudo bash -c 'cat file2 >> file1'
O método usual de simplesmente anexar sudo
ao comando falhará, pois a escalação de privilégios não é transferida para o redirecionamento de saída.
cat file2 | sudo tee -a file1 > /dev/null
Apenas para referência, o uso do ddrescue fornece uma maneira interruptível de realizar a tarefa se, por exemplo, você tiver arquivos grandes e a necessidade de pausar e continuar em algum momento posterior:
ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile
A parte logfile
é importante. Você pode interromper Ctrl-C
e retomar o processo especificando exatamente o mesmo comando novamente e o ddrescue lerá logfile
e continuará de onde parou. O -o A
sinalizador diz ao ddrescue para iniciar a partir do byte A no arquivo de saída ( file1
). Então, wc --bytes file1 | awk '{ print $1 }'
apenas extrai o tamanho de file1
bytes (você pode colar a saída dels
se quiser).
Como apontado por ngks nos comentários, a desvantagem é que o ddrescue provavelmente não será instalado por padrão; portanto, você terá que instalá-lo manualmente. A outra complicação é que existem duas versões do ddrescue que podem estar em seus repositórios: veja esta pergunta do askubuntu para mais informações. A versão que você deseja é o GNU ddrescue, e nos sistemas baseados no Debian é o pacote chamado gddrescue
:
sudo apt install gddrescue
Para outras distribuições, verifique seu sistema de gerenciamento de pacotes quanto à versão GNU do ddrescue.
Outra solução:
cat file1 | tee -a file2
tee
tem o benefício de que você pode anexar a quantos arquivos desejar, por exemplo:
cat file1 | tee -a file2 file3 file3
vai anexar o conteúdo de file1
a file2
, file3
efile4
.
Na página do manual:
-a, --append
append to the given FILEs, do not overwrite
cat
pode ser a solução mais fácil, mas que fica muito lenta quando concateamos arquivos grandes, find -print
é resgatá-lo, embora você precise usar o gato uma vez.
amey@xps ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt
amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt
real 0m3.084s
user 0m0.012s
sys 0m2.308s
amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1
real 0m2.516s
user 0m0.028s
sys 0m2.204s
time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)
e deve produzir resultados semelhantes ao seu comando somente gato.
Você também pode fazer isso sem cat
, embora honestamente cat
seja mais legível:
>> file1 < file2
A >>
anexa STDIN para file1
eo <
despeja file2
para STDIN .