Eu sou tipo de novato para Linux, e gostaria de saber se deve ou não >
e touch
ter 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.
command-line
lmiguelvargasf
fonte
fonte
file.txt
já existe e não está vazio, certamente não existe.touch
um arquivo que contém dados nada acontecerá, mas se>
o arquivo será apagado.Respostas:
Ambos
touch
e>
criarão um novo arquivo se ele não existir. Como os seguintes comandos do terminal mostram quandotouch
um 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>
/ outruncate
é comumente usado para limpar arquivos de log, mesmo com um identificador de arquivo aberto.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 comocat source.fil > target.fil
.Um formulário longo para esvaziar um arquivo seria:
Usar
> emptme.fil
realiza a mesma coisa em um formato compacto de redirecionar nada para o arquivo.fonte
> file.txt
é bom para limpar arquivos de log.ln foo bar
, em seguida, excluir e recriarfoo
,bar
ainda tem seu conteúdo anterior).rm /var/log/nginx/access.log
enquanto o nginx tivesse esse arquivo aberto, ele teria 0 links, mas o inode ainda existiria.lsof -c nginx | grep access.log
depois com o pid,ls -l /proc/<pid>/fd/ | grep access.log
e finalmente cat / proc / <pid> / fd / <filename do comando anterior> `. Comentando mesmo que isso seja antigo. Esperança que fazia sentidoHá 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:
Isso criará os seguintes arquivos (ou alterará o carimbo de data e hora, se eles existirem):
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).
Esta é uma saída parcial do comando find acima:
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:
Poderíamos usar nosso
find
comando 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:fonte
file.txt
existir e não estiver vazio,> file.txt
limpará seu conteúdo, mastouch file.txt
não o fará. Mas ninguém mencionou que>> file.txt
é um bom substituto paratouch 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 ">>"?Usage of Output redirection
. Aviso é diz>>
=Redirect append>
.>> file.txt
é um substituto viáveltouch 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.)>
é 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 comopen(2)
-ed comO_TRUNC
sinalizador 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:Uma solução típica é adicionar o comando
:
(true
) no-op:Tradicionalmente, o principal objetivo do
touch
é alterar o carimbo de data e hora de um arquivo, não criando um arquivo.touch
cria 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 usandotouch
.fonte
zsh
suporta redirecionamento vazio - age de maneira semelhante ao redirecionamentocat
sem argumentos para um arquivo. Basicamente, o que você digitar será gravado no arquivo até um caractere EOF ou uma interrupção. Isso refletezsh
o comportamento de just<file
, que simplesmente imprime o conteúdo do arquivo, comocat
faria. Estes podem ser configuráveis, eu já vi<file
abrir o arquivo em um pager.EOF
(como fazer ocat >file.txt
que você disse), ondebash
apenas fazer>file.txt
seria suficiente.touch
atualiza 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çãotouch
que permite ao usuário alterar o tempo de criação do inode?