Qual é a diferença entre touch file e> file?

17

Eu sou tipo de novato para Linux, e gostaria de saber se deve ou não >e touchter o mesmo efeito. Quero dizer, os dois comandos a seguir têm o mesmo efeito ?:

$ > file.txt

$ touch file.txt

Nesse caso, seria ótimo saber que eu posso apenas digitar `> file.txt 'para criar novos arquivos.

lmiguelvargasf
fonte
5
Se file.txtjá existe e não está vazio, certamente não existe.
precisa saber é o seguinte
1
@fkraiem, você poderia fazer uma resposta elaborada?
Lmiguelvargasf 30/09/16
4
Ele está dizendo que se touchum arquivo que contém dados nada acontecerá, mas se >o arquivo será apagado.
WinEunuuchs2Unix 30/09/16
Deixa comigo. Muito obrigado pelo esclarecimento @ WinEunuuchs2Unix
lmiguelvargasf
Gostaria de responder à pergunta, me responder, ou @fkraiem responder ou excluí-lo?
WinEunuuchs2Unix 30/09/16

Respostas:

24

Ambos touche >criarão um novo arquivo se ele não existir. Como os seguintes comandos do terminal mostram quando touchum arquivo existente, o acesso / hora da última modificação são atualizados. Mas se você >usar um arquivo existente, ele será truncado e a hora da última modificação será atualizada (o tempo de acesso não é). Observe que >não exclui / desvincula o arquivo. O inode permanece o mesmo - razão pela qual >/ ou truncateé comumente usado para limpar arquivos de log, mesmo com um identificador de arquivo aberto.

rick@dell:~$ > EmptyFile

rick@dell:~$ touch EmptyFile2

rick@dell:~$ ls Empty*
EmptyFile  EmptyFile2

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ > EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 0 Sep 29 20:28 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

rick@dell:~$ echo Hello > EmptyFile

rick@dell:~$ touch EmptyFile

rick@dell:~$ ls -l Empty*
-rw-rw-r-- 1 rick rick 6 Sep 29 20:32 EmptyFile
-rw-rw-r-- 1 rick rick 0 Sep 29 20:27 EmptyFile2

Como mencionado nos comentários, touché um comando externo e opera apenas em arquivos. >é um recurso interno do shell que serve a muitos propósitos diferentes. Normalmente, você o usaria como cat source.fil > target.fil.

Um formulário longo para esvaziar um arquivo seria:

cat /dev/null > emptyme.fil

Usar > emptme.filrealiza a mesma coisa em um formato compacto de redirecionar nada para o arquivo.

WinEunuuchs2Unix
fonte
Caso de uso: > file.txté bom para limpar arquivos de log.
Rinzwind
8
Na verdade, não é recriado. O arquivo existente está truncado, o que é diferente de desvincular o arquivo antigo e criar um novo. A maior diferença observável é que, se um processo ainda tiver o arquivo antigo aberto ou mapeado, ele ainda existiria. Mas o truncamento afetaria o arquivo aberto por outros processos.
Peter Cordes
1
Não tem certeza sobre o "maior observável" - é fácil observar se os hardlinks estão quebrados (se você ln foo bar, em seguida, excluir e recriar foo, barainda tem seu conteúdo anterior).
Charles Duffy
1
Ah, sim, essa é uma diferença ainda mais facilmente observável. Eu deveria ter pensado nisso: P
Peter Cordes
@ Charles-Duffy Claro, quando existem dois links para um arquivo que seria óbvio, eu acho, isso não tem nada a ver com o que Peter Cordes estava dizendo. Quando você exclui / desvincula um arquivo que está em uso no momento / possui um arquivo aberto, ele não é excluído. por exemplo, digamos que, rm /var/log/nginx/access.logenquanto o nginx tivesse esse arquivo aberto, ele teria 0 links, mas o inode ainda existiria. lsof -c nginx | grep access.logdepois com o pid, ls -l /proc/<pid>/fd/ | grep access.loge finalmente cat / proc / <pid> / fd / <filename do comando anterior> `. Comentando mesmo que isso seja antigo. Esperança que fazia sentido
skrewler
14

Há uma diferença substancial entre os dois. Touché um comando usado para registrar o horário de um arquivo. O >símbolo é um redirecionador de saída padrão.

Uso dos dois explicado

Uso do toque

Se o arquivo não existir, ele será criado.

O toque é comumente usado para criar sinalizadores. Por exemplo, se você deseja encontrar todos os arquivos entre duas vezes no seu sistema, você pode usar esta sequência de comandos:

$ touch -t 201609292200 starttime 
$ touch -t 201609292300 endtime

Isso criará os seguintes arquivos (ou alterará o carimbo de data e hora, se eles existirem):

-rw-rw-r-- 1 ljames ljames 0 Sep 29 23:00 endtime
-rw-rw-r-- 1 ljames ljames 0 Sep 29 22:00 starttime

Agora você pode usar o find para exibir ou processar todos os arquivos que foram modificados naquela hora (horário entre esses dois arquivos, ou seja, entre 22h e 23h de 29 de setembro de 2016).

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n"

Esta é uma saída parcial do comando find acima:

-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/[email protected]_groups.xml
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/google_feed_backups/[email protected]
-rw-rw-r-- 09/29 22:08 08 /home/users/l/j/ljames/.thunderbird/lj7p62iq.default/gcontactsync/address_book_backups/abook.mab.bak
-rw-rw-r-- 09/29 23:00 00 /home/users/l/j/ljames/endtime
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/Temp
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi
drwx------ 09/29 22:44 44 /home/users/l/j/ljames/.config/google-chrome/Default/Extensions/fahmaaghhglfmonjliepjlchgpgfmobi/1.337.0_0

Uso do redirecionamento de saída

O símbolo de redirecionamento redirecionará a saída padrão para o arquivo especificado. Dependendo das configurações do clobber / noclobber, se houver falha. O Noclobber criará o arquivo apenas se ele não existir.

Há várias versões da saída de redirecionamento que incluem:

> - Redirecionar a saída padrão. Crie ou substitua o arquivo existente.
>> - Redirecionar anexar. Crie ou acrescente ao arquivo existente.
> & - Redirecione a saída padrão e o erro padrão.
>> & - Redirecionar / acrescentar saída padrão e erro padrão

Poderíamos usar nosso findcomando acima para redirecionar o conteúdo de todos os arquivos criados dentro da hora especificada para um arquivo que poderíamos registrar e estudar mais tarde:

$ find ~/ -newer starttime ! -newer endtime -printf "%M %Tm/%Td %TH:%TM %TM %p\n" > ~/files.log
LD James
fonte
Muitas pessoas mencionaram que, se file.txtexistir e não estiver vazio, > file.txtlimpará seu conteúdo, mas touch file.txtnão o fará. Mas ninguém mencionou que >> file.txté um bom substituto para touch file.txt- ele criará o arquivo se ele não existir (supondo que você tenha permissão para fazê-lo), mas não truncará um arquivo existente. Consulte Qual é a diferença entre ">" e ">>"?
G-Man diz 'Reinstate Monica'
Isso é explicado na seção Usage of Output redirection. Aviso é diz >>= Redirect append>.
LD James
Sim, e isso é perfeitamente claro - para as pessoas que já conhecem. Coloque-se no lugar do OP - você publicou uma parede de texto que é muito longo demais para ler ; ele não vai entender pela sua resposta que >> file.txté um substituto viável touch file.txt. (O fato de que você é a única pessoa que mencionou >> em tudo é por isso que eu postei o meu comentário sob a sua resposta, em vez de sob a pergunta.)
G-Man diz que 'Reintegrar Monica'
1
@ G-Man Algumas pessoas confundem o símbolo de redirecionamento para substituir o toque. No entanto, não é um substituto. Os detalhes da minha resposta são para esclarecer esse erro. Os exemplos de uso dos dois são para ajudar a esclarecê-lo. Observe que a primeira linha responde às especificidades iniciais do seu comentário atual. Diz que há uma diferença significativa entre os dois. O OP está interessado na diferença. Portanto, as outras partes da resposta são responder ao interesse do OP nos dois. Existem efeitos diferentes e há razões para a diferença.
LD James
9

>é o operador de redirecionamento de saída do shell, usado para redirecionar STDOUT dos comandos anteriores para o descritor de arquivo mencionado depois >. Se o arquivo estiver presente, seu conteúdo será truncado, como arquivo com open(2)-ed com O_TRUNCsinalizador e, se o arquivo não existir, ele será criado.

É importante observar que esse operador de redirecionamento será tratado pelo shell antes da execução do comando anterior, portanto, isso não depende de nenhum comando e tratado pelo próprio shell.

Observe que alguns shells (por exemplo zsh) se comportarão de maneira diferente com o redirecionamento vazio, como:

 >file.txt

Uma solução típica é adicionar o comando :( true) no-op:

 : >file.txt

Tradicionalmente, o principal objetivo do touché alterar o carimbo de data e hora de um arquivo, não criando um arquivo.

touchcria um arquivo, apenas quando o (s) arquivo (s) mencionado (s) no argumento não existe, caso contrário, altera o horário da modificação do arquivo para o carimbo de data / hora atual. Você também pode alterar o tempo de acesso e o tempo de criação do inode usando touch.

heemail
fonte
zshsuporta redirecionamento vazio - age de maneira semelhante ao redirecionamento catsem argumentos para um arquivo. Basicamente, o que você digitar será gravado no arquivo até um caractere EOF ou uma interrupção. Isso reflete zsho comportamento de just <file, que simplesmente imprime o conteúdo do arquivo, como catfaria. Estes podem ser configuráveis, eu já vi <fileabrir o arquivo em um pager.
8bittree
@ 8bittree O que eu quis dizer é que você precisa inserir EOF(como fazer o cat >file.txtque você disse), onde bashapenas fazer >file.txtseria suficiente.
heemayl
Justo, sugeri uma edição que acho que transmite a ideia mais claramente.
8bittree
@ 8bittree aprovado.
heemayl
(1) Por padrão, touchatualiza o tempo de modificação e o tempo de acesso do arquivo. Existem opções para atualizar apenas um ou outro. (2) Unix / Linux / POSIX não suporta "hora de criação do inode", em geral. Alguns tipos de sistema de arquivos o suportam, mas não há uma maneira universal de ver, muito menos modificá-lo. Você pode fornecer uma referência que diz que existe uma encarnação touchque permite ao usuário alterar o tempo de criação do inode?
Scott