Eu tenho dois arquivos: file1
e file2
. Como anexo o conteúdo de file2
a file1
para que o conteúdo file1
persista no processo?
418
Use o redirecionamento interno do bash (tldp) :
cat file2 >> file1
sudo
ocat
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, primeirofile1
é truncado para comprimento zero e aberto para saída, então ocat
comando tenta concatenar o arquivo agora com tamanho zero mais o conteúdo defile2
intofile1
. O resultado é que o conteúdo originalfile1
é perdido e, em seu lugar, é uma cópia dafile2
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:
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:
... 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.
fonte
cat file1 file2 > file1
- isso não funcionará como você provavelmente está esperando.>>
o que irá modificar o arquivofile1
. 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 essecat file1 file2 > file3
é o comando apropriado que o @asir estava procurando.>
é executada primeiro. Portanto, a execuçãocat file1 file2 > file1
primeiro atrapalha efile1
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.fonte
cat file2 | sudo tee -a file1 > /dev/null
Tente este comando:
fonte
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:
A parte
logfile
é importante. Você pode interromperCtrl-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 defile1
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
:Para outras distribuições, verifique seu sistema de gerenciamento de pacotes quanto à versão GNU do ddrescue.
fonte
Outra solução:
tee
tem o benefício de que você pode anexar a quantos arquivos desejar, por exemplo:vai anexar o conteúdo de
file1
afile2
,file3
efile4
.Na página do manual:
fonte
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.fonte
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 honestamentecat
seja mais legível:>> file1 < file2
A
>>
anexa STDIN parafile1
eo<
despejafile2
para STDIN .fonte