Como enviar um arquivo como entrada para outro arquivo?

7

Por meio do shell de comando, podemos redirecionar os três fluxos padrão para que possamos obter entrada de um arquivo ou de outro comando em vez de em nosso teclado, e poderemos gravar saída e erros em arquivos ou enviá-los como entrada para comandos subsequentes .

Então, por que não podemos dar entrada a um outro arquivo como

~# /root/Documents/text1.txt > /root/Documents/text2.txt
    
por arvind 16.09.2014 / 09:02

5 respostas

16

Você não pode usar file1 > file2 para copiar o conteúdo de file1 para file2 porque não há comando lá. Você tem que emitir algum comando.

  • Os redirecionamentos se aplicam a (1) um comando executado ou (2) o shell como um todo (se aplicado ao exec builtin). Mas eles funcionam alterando a origem ou o destino das ações que executam operações de entrada - ou seja, que leem ou gravem em um arquivo ou dispositivo. Você tem que realmente realizar alguma ação.
  • file1 > file2 é um comando válido, sob algumas circunstâncias, mas não copia file1 para file2 . Em vez disso, como l0b0 diz , ele tenta executar file1 como um programa ou script, e - quer isso tenha sucesso ou não - envia o resultado padrão da execução de file1 para %código%. (Se file2 for um arquivo regular, ele será sobrescrito).
  • É tentador pensar que algo como file2 funcionaria. Mas isso não acontece: quando você deixa o comando, nenhuma operação é executada. <file1 >file2 é usado como entrada e file1 é usado como saída ... mas como nada é realmente feito , a saída está vazia, o único efeito é (a) criar file2 se ele já não existe ou (b) crie file2 empty se ele existir:

    ek@Ilex:~$ echo foobar > file1
    ek@Ilex:~$ echo quux > file2
    ek@Ilex:~$ cat file1
    foobar
    ek@Ilex:~$ cat file2
    quux
    ek@Ilex:~$ <file1 >file2
    ek@Ilex:~$ cat file2
    ek@Ilex:~$ file file1 file2
    file1: ASCII text
    file2: empty
    

Você provavelmente só quer executar file2 .

Assumindo, isto é, que cp file1 file2 é um arquivo regular (ou não existe, mas você quer que ele exista como um arquivo regular após a execução do seu comando), provavelmente você deve simplesmente usar o file2 comando.

Como Sylvain Pineau diz , você pode usar cp também. No entanto, o comando cat file1 > file2 é bem comportado ao gravar em um arquivo que já existe: ele sobrescreve o destino com a origem, mas mantém o original permissões de máscara (e, portanto, é bom mesmo em situações em que alguém pode pensar intuitivamente cp foram necessários):

ek@Ilex:~$ echo glockenspiel > file1
ek@Ilex:~$ echo flugelhorn > file2
ek@Ilex:~$ cat file1
glockenspiel
ek@Ilex:~$ cat file2
flugelhorn
ek@Ilex:~$ chmod +x file2
ek@Ilex:~$ ls -l file1 file2
-rw-rw-r-- 1 ek ek 13 Sep 16 03:28 file1
-rwxrwxr-x 1 ek ek 11 Sep 16 03:28 file2
ek@Ilex:~$ cp file1 file2
ek@Ilex:~$ cat file2
glockenspiel
ek@Ilex:~$ ls -l file1 file2
-rw-rw-r-- 1 ek ek 13 Sep 16 03:28 file1
-rwxrwxr-x 1 ek ek 13 Sep 16 03:28 file2

Para acrescentar , você provavelmente quer um redirecionamento (diferente).

Tanto o comando cat file1 > file2 quanto o redirecionamento com cp irão sobrescrever o conteúdo de um arquivo regular, se existir. Mas > redireciona os anexos.

Portanto, se você quiser acrescentar o conteúdo de >> a file1 em vez de substituir file2 pelo conteúdo de file2 , um redirecionamento com file1 ( não >> ) é uma boa escolha:

ek@Ilex:~$ echo 'Violets are blue.' > file1
ek@Ilex:~$ echo 'Roses are red.' > file2
ek@Ilex:~$ cat file1
Violets are blue.
ek@Ilex:~$ cat file2
Roses are red.
ek@Ilex:~$ cat file1 >> file2
ek@Ilex:~$ cat file2
Roses are red.
Violets are blue.
    
por Eliah Kagan 16.09.2014 / 09:37
8

Você pode redirecionar o conteúdo de text1.txt usando o comando cat :

~# cat /root/Documents/text1.txt > /root/Documents/text2.txt

Observação : você pode usar cat para criar novos arquivos binários, por exemplo:

~# cat mypic.jpg > my_new_pic.jpg
    
por Sylvain Pineau 16.09.2014 / 09:07
1

Para expandir em @ resposta de SylvainPineau , a razão pela qual você não pode fazer /root/Documents/text1.txt > /root/Documents/text2.txt é que a coisa é separada de o operador de redirecionamento e o arquivo depois dele ter que ser um comando . Quando você executa /root/Documents/text1.txt > /root/Documents/text2.txt você está dizendo ao shell para executar /root/Documents/text1.txt , o que provavelmente não irá mesmo executado, uma vez que os arquivos de texto não devem ter o sinalizador de execução definido e salvar a saída padrão em /root/Documents/text2.txt . Como a saída padrão desse "comando" está vazia, o arquivo de destino estará vazio.

    
por l0b0 16.09.2014 / 09:36
0

Redirecionamento de saída de comando:

ls > file.txt

ls fornece uma listagem de diretórios e a saída do comando ls é redirecionada para o arquivo.txt.

Redirecionamento de erros:

command 2>~/Desktop/errorsfile.txt

Isso redirecionará o resultado do erro do comando para um arquivo txt .

Para redirecionamento de conteúdo de arquivo:

  1. cat file1 > file2 (copiará o conteúdo do arquivo1 para um novo arquivo2)
  2. cat file2 >> file1 (aqui copiaremos o conteúdo do arquivo2 para um arquivo de arquivo existente1 sem excluir seu conteúdo)
  3. cat file1 file2 > file3 (Isso adicionaria o conteúdo de 'file1' e 'file2' e, em seguida, gravaria esses conteúdos em um novo arquivo chamado 'file3')

Eu também gostaria de adicionar o redirecionamento de entrada:

$ mail -s "Hello World" [email protected] < /home/user/mailcontent.txt

Aqui, se o corpo do e-mail estiver em um arquivo, podemos usá-lo diretamente para enviar o e-mail.

    
por nux 16.09.2014 / 13:33
0

Como outros já afirmaram, você está perdendo um comando. Aqui estão algumas combinações interessantes:

cat <file1.txt >file2.txt
tail <file1.txt >file2.txt
head <file1.txt >file2.txt
wc -l <file1.txt >file2.txt
base64 <file1.txt >file2.txt
base64 -D <file1.txt >file2.txt
gzip -c <file1.txt >file2.txt
gunzip -c <file1.txt >file2.txt

O espírito da tubulação / redirecionamento indica que um comando (como copiar, extrair, contar, codificar / decodificar, compactar / descompactar) é necessário para especificar a ação para transformar a entrada file1.txt na saída file2.txt .

    
por Stephen Quan 17.09.2014 / 07:51