Criar arquivo vazio de maneira correta no Linux. Não é o touch. Nunca foi. Nunca será...

Publicado por thalison wilker da silva em 30/03/2017

[ Hits: 45.052 ]

 


Criar arquivo vazio de maneira correta no Linux. Não é o touch. Nunca foi. Nunca será...



É verdade que existem diversas formas de se fazer a mesma coisa no Linux, isso é fato. O negócio complica quando a pergunta é "qual a melhor forma?", ou "qual a forma mais eficaz?". Bom, em certas situações, existe sim uma maneira correta, e também existem métodos não ortodoxo (gambiarras).

Vou falar (escrever) um pouco sobre a forma correta de se criar arquivos no GNU/Linux. Eu também sou iniciante no Linux e pretendo me aprofundar no sistema. Acredito que você também pretenda se aprofundar nele, seja pelo mercado, seja pela cultura ou seja pela comunidade. De qualquer modo, estamos juntos nesse barco e acredito que essa dica tenha alguma importância. Sendo assim vale a pena compartilha-la.

Quando estamos engatinhando no sistema GNU/Linux, dando os primeiros passo (ou, os primeiros comandos) precisamos entender exatamente o que cada comando faz, um comando é como um passo: basta um passo em falso para que você se desequilibre e caia. Então é preciso ter certeza que demos o passo correto. Se seu objetivo for simplesmente andar (sem se preocupar com a maneira correta ou mais segura de andar), você irá andar. Mesmo que você ande de forma desajeitada, insegura ou até mesmo desastrosa (muito eu), parabéns você andou! Agora ande da forma correta e segura.

Não sei quem você é, mas posso supor que um dos seus primeiros comandos no GNU/Linux foi o... ls (list, para listar o conteúdo do diretório atual)? Ou quem sabe o cd/chdir (change directory, trocar de diretório), ou o mkdir (make directory, criar um diretório), rmdir(remove directory, remove um diretório vazio), rm(remove, remove um diretório ou arquivo) e o touch (cria um arquivo vazio). Acho que de tanto chute eu acertei qual foi um sei primeiro comando kkk (digita aí qual foi o seu primeiro comando xD).

Bom, todos os comandos citados anteriormente executam fielmente a sua função, exceto um, o touch - cria um arquivo vazio. O comando touch não cria arquivo coisa nenhuma, ele altera o tempo de acesso do arquivo.

Vamos analisar alguns casos - quando você for treinar certifique-se de estar logado em root ou em um usuário com permissões de leitura e gravação em disco.

touch arquivo1

O que esse comando fez? Ele criou um arquivo?

Sim (ls para ver o arquivo), não só isso, ele criou um arquivo alterando o tempo de acesso atual (data e hora atual), mas que para tudo isso tivesse sido feito, primeiro o comando guardou em disco a data e a hora atual, depois tentou alterar essas informações no arquivo arquivo1, como esse arquivo não existe ele simplesmente o criou (para não perder a viajem) em seguida fez as modificações.

Está errado criar arquivos com touch? Tecnicamente sim, levando em consideração todo esse trabalho que o sistema teve, houve uma grave perda de tempo. Tem como medir o tempo de execução do comando? Sim! :), veja a baixo um exemplo.

Execute:

time touch arquivo2

A saída na minha máquina foi a seguinte:

real	0m0.031s
user	0m0.001s
sys	0m0.024s

Podemos ver que o tempo gasto foi de 0.031 segundo. Muito rápido, certo? Errado. Ele levou um tempão.

Então qual a forma correta?

Quando pedimos para o sistema simplesmente guardar nada no arquivo tal, ele o execute sem pestanejar, afinal essa é a sua verdadeira função!

Execute o comando abaixo:

>arquivo2

Observe que foi usado o ">"(maior que) seguido de um argumento, o nome do arquivo. Tá ... Mas e daí? Ele também cria um arquivo, da mesma forma do touch. Da mesma forma eu garanto que não. O comando touch executa algumas outras instruções por baixos dos panos, o que o torna demorado... Já usando o ">"(maior que), vamos direto ao ponto: criar um arquivo vazio.

Vamos medir o tempo dele?

time >arquivo3

A saída na minha máquina foi a seguinte:

real	0m0.000s
user	0m0.000s
sys	0m0.000s

Ganhamos bastante tempo, não?

Também vemos que quando uma determinada coisa é usada exatamente da forma adequada, sua eficácia aumenta bastante. Sim existem várias formas de se criar um arquivo no GNU/Linux, e usando o touch é uma forma desajeitada e ineficaz de se fazer isso.

Talvez seu instrutor tenha noção de estar lhe repassando um conhecimento errôneo, talvez não.

Se essa dica te ajudou em alguma coisa, meu objetivo foi comprido. Sempre questione tudo, a curiosidade é a principal matéria prima da inovação.

E como é que se usa o touch? Se ficou curioso, pede nos comentários porque isso são páginas para o próximo capítulo! Muito obrigado pela atenção e valeu.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Indentar XML automaticamente

Listando pacotes no Debian

Como reparar Portage danificado

FFmpeg - Gravando legenda para vídeo

Substituição de palavras no VIM

  

Comentários
[1] Comentário enviado por Carlos_Cunha em 30/03/2017 - 19:57h

Isso é o mesmo que dizer que o "cat" serve para ler arquivos, esta errado usar o cat(concatenador) para visualizar um arquivo?, Não, pelo menos eu não acredito, mesmo não sendo sua função primaria o mesmo a executa com perfeição, assim como o touch para criar um simples arquivo.
Agora se sua ideia for maximizar processos, ai concordo com vc que deve sempre se usar "comandos" que sua função principal seja aquela desejada.
Como você mesmo informou a sempre varias formar de se chegar no mesmo resultado, vale muito de como se deseja chegar(idem exemplos que vc usou de caminhar).


Abraço
#-------------------------------------------------------------------------------------#

"Linux is cool"

[2] Comentário enviado por removido em 30/03/2017 - 22:21h

Muito legal essa informação. Parabéns ao autor!
Aguardo ansiosamente pela dica sobre como usar o touch de forma adequada.

[3] Comentário enviado por oletros em 31/03/2017 - 11:34h

Opcoes

truncate -s${tamanho} ${arquivo}
Cria um arquivo de {tamanho} bytes, mas sem ocupar espaco em disco (sparse file / zeros file)

fallocate -l ${tamanho} ${arquivo}
Cria um arquivo de {tamanho} bytes, ocupando de fato o espaco em disco (aloca o espaco)

dd if=/dev/urandom of=${arquivo} bs=1 count=0 seek=${tamanho}
Cria um arquivo de {tamanho} bytes, ocupando de fato o espaco em disco, preenchendo com dados aleatorios

openssl rand ${tamanho} >${arquivo}
Cria um arquivo de {tamanho} bytes, ocupando de fato o espaco em disco, preenchendo com dados aleatorios (metodo alternativo)

[4] Comentário enviado por conectadohost em 01/04/2017 - 18:23h

Olá,
echo -n > arquivo

---> Márcio M M <---

[5] Comentário enviado por elgio em 01/04/2017 - 20:58h

Desculpe amigo, mas não é nada disso. Estas muito equivocado.

O time mede o tempo de execução de um programa. Se tu chamar ele sem nada, como fazes, o tempo será zero pois ele não teve nada para medir. Não estás, nem por um instante, medindo o tempo necessário para criar o arquivo,pois não há chamada de nada.

Ah, outra coisa: quando tu faz time >arquivo tu estás criando um arquivo com a saída do time.

Quando tu usa o redirecionamento sem nada é o shell trabalhando par você. É até possível que ele seja mais rápido que um touch, mas aí dizer que o touch "nunca foi" é quase uma aberração. Bota título sensacionalista nisso, hein?

[6] Comentário enviado por lcavalheiro em 01/04/2017 - 22:16h

De boa, eu não vejo uma dica tão ruim como essa tem um tempo. Vamos rodar um $ man touch:

Update the access and modification times of each FILE to the current
time.

A FILE argument that does not exist is created empty, unless -c or -h
is supplied.

Bingo. Se a manpage do touch diz que ele serve pra criar arquivos, você falou uma baita besteira nessa dica. Não tem como salvar a baboseira inteira.
--
Dino®
[i]Vi veri universum vivus vici[/i]
Public GPG signature: 0x246A590B
Só Slackware é GNU/Linux e Patrick Volkerding é o seu Profeta
[code][b]Mensagem do dia[/b]: Satã representa conhecimento sem limites e não auto-ilusão hipócrita.[/code]

[7] Comentário enviado por conectadohost em 02/04/2017 - 09:04h


[5] Comentário enviado por elgio em 01/04/2017 - 20:58h

Desculpe amigo, mas não é nada disso. Estas muito equivocado.

O time mede o tempo de execução de um programa. Se tu chamar ele sem nada, como fazes, o tempo será zero pois ele não teve nada para medir. Não estás, nem por um instante, medindo o tempo necessário para criar o arquivo,pois não há chamada de nada.

Ah, outra coisa: quando tu faz time &gt;arquivo tu estás criando um arquivo com a saída do time.

Quando tu usa o redirecionamento sem nada é o shell trabalhando par você. É até possível que ele seja mais rápido que um touch, mas aí dizer que o touch "nunca foi" é quase uma aberração. Bota título sensacionalista nisso, hein?


http://i.prntscr.com/5fd7b838c1404d9da0abcbe0abf250b3.png
http://i.prntscr.com/7b54505e316e4e9497500ec06d60e798.png

[8] Comentário enviado por EnzoFerber em 03/04/2017 - 09:26h

Olá,

Antes de mais nada, parabéns pelo modelo mental de sempre questionar. Entretanto...
Como já dito pelos colegas @elgio e @lcavalheiro, esta dica está totalmente errada.
O redirecionamento do shell (bash, ou similar) não é medido pelo time, até porque o argumento *não chega* ao time.
Um simples programa em C te mostra o que acontece:

/* redir.c
* gcc -o redir redir.c -Wall
*
* (C) 2017 - Enzo Ferber, <enzoferber@gmail.com>
*/
#include <stdio.h>

int main(int argc, char *argv[])
{
for(int i = 0; i < argc; i++)
printf("argv[%d]: %s\n", i, argv[i]);

return 0;
}
/* EoF */

Compile o programa e rode:
$ gcc -o redir redir.c -Wall
$ ./redir >out.txt
argv[0]: ./redir
$ ls
redir.c redir* out.txt
$

Como pode ver, o arquivo foi criado da mesma forma, mas o programa nunca viu o argumento ">out.txt". Antes de chamar o programa, o bash quebra toda a linha de comando em tokens, prepara os redirecionamento (pipes, etc), abre arquivos, e faz um monte de parafernalhas, depois faz um fork() (ou vários) e então chama execve() com os argumentos da linha de comando _válidos_. O seu "time >out.txt" na verdade é chamado, no final das contas, como "time" (sem argumentos).


EDIT: pode também verificar a veracidade do argumento chamando time com aspas. Isso vai passar o argumento diretamente para ele.

$ time ">out.txt"
This command was not found: >out.txt

real 0m0.001s
user 0m0.000s
sys 0m0.000s


Enzo Ferber
[]'s

[9] Comentário enviado por EnzoFerber em 03/04/2017 - 09:29h


[4] Comentário enviado por conectadohost em 01/04/2017 - 18:23h

Olá,
echo -n >arquivo

---&gt; Márcio M M &lt;---


Você está utilizando o redirecionamento do bash, não o comando echo.
Quem gerencia redirecionamento é o shell, não o comando chamado.

No caso do seu exemplo com echo: tudo o que echo faz é imprimir alguma coisa na saída padrão.
A opção -n faz com que não seja impressa uma nova linha.
Portanto, o shell vai abrir um arquivo e redirecionar a saída de echo para o arquivo, que, neste caso, é vazia.




Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts