Por que não há nenhum comando shell para criar arquivos?

28

Atenção, por favor:

Eu sou não perguntando como fazer um arquivo a partir da linha de comando!

Eu tenho usado touch para fazer arquivos por anos sem prestar atenção que seu propósito principal é outra coisa. Se alguém quiser criar um arquivo a partir da linha de comando, existem muitas possibilidades:

touch foo.bar
> foo.bar
cat > foo.bar
echo -n > foo.bar
printf '' > foo.bar

E tenho certeza de que há mais.

Mas o fato é que nenhum dos comandos acima foi projetado para criar arquivos. Por exemplo, man touch sugere que este comando é para alterar registros de data e hora de arquivos. Por que um SO tão completo quanto o Unix (ou Linux) tem um comando projetado exclusivamente para criar arquivos?

    
por Pouya 10.04.2014 / 13:32

4 respostas

39

Eu diria porque é quase desnecessário criar um arquivo vazio que você não preencherá com conteúdo imediatamente na linha de comando ou no script de shell.

Não há absolutamente nenhum benefício em criar um arquivo primeiro e depois usar o redirecionamento de E / S para gravar no arquivo, se você puder fazer isso em uma única etapa.

Nos casos em que você realmente deseja criar um arquivo vazio e deixá-lo, eu diria que > "${file}" não poderia ser mais breve e elegante.

TL; DR : não existe porque criar arquivos vazios na maioria das vezes não tem uso e, em alguns casos, já existe uma infinidade de opções disponíveis para atingir essa meta.

Em uma nota secundária, usar touch só funciona se o arquivo não existir enquanto as opções que usam redirecionamento sempre truncarão o arquivo, mesmo que ele exista (portanto, tecnicamente, essas soluções não são idênticas). > foo é o método preferido, já que salva fork e echo -n deve ser evitado em geral, já que é altamente não suportável.

    
por 10.04.2014 / 13:51
16

A resposta de Adrian Frühwirth está correta. Eu só queria acrescentar que existe realmente um comando escrito especificamente para criar arquivos: mktemp .

NAME
       mktemp - create a temporary file or directory

SYNOPSIS
       mktemp [OPTION]... [TEMPLATE]

DESCRIPTION
       Create a temporary file or directory, safely, and print its name.  TEM‐
       PLATE must contain at least 3 consecutive 'X's in last  component.   If
       TEMPLATE is not specified, use tmp.XXXXXXXXXX, and --tmpdir is implied.
       Files are created u+rw, and directories  u+rwx,  minus  umask  restric‐
       tions.

Concedido, o trabalho de mktemp não é criar um arquivo com um nome específico, é simplesmente criar um arquivo . No entanto, como você já foi dito, existem muitas maneiras mais eficientes e elegantes de criar arquivos com um determinado nome que fornecer um comando para isso seria inútil.

Dito isto, você também tem truncate e fallocate , cuja finalidade principal é criar arquivos. Eles simplesmente têm uma abordagem mais sofisticada. Nunca haverá um programa simples que faça o que o > file faz, pois não há como ser melhor do que > file .

    
por 10.04.2014 / 17:41
11

A maioria das ferramentas básicas do shell não são projetadas para nenhum propósito específico. A maioria das ferramentas básicas de shell é projetada apenas para interagir com outras pessoas para atingir seu objetivo. Ou talvez deva ser dito que a maioria das ferramentas faz apenas uma coisa básica, independentemente de como elas podem ser combinadas para atingir um objetivo.

: >./file

Isso cria um arquivo vazio. Ou trunca um arquivo existente como você. Você pode:

set -o noclobber

para evitar qualquer possibilidade do último caso, a menos que você:

: >|./file

Você pode obter um comportamento semelhante ao touch com:

: >>./file
: >>|./file

Só que : não atualizará o modtime de um arquivo porque ele não foi modificado.

DEMO

mkdir test ; cd $_
touch touch.file 
: >null.file
echo >echo.file
ls -l

OUTPUT

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file

NÃO TOQUE

: >>|./echo.file
ls -l 

OUTPUT

-rw-r--r-- 1 mikeserv mikeserv 1 Apr 10 14:52 echo.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 null.file
-rw-r--r-- 1 mikeserv mikeserv 0 Apr 10 14:52 touch.file
    
por 10.04.2014 / 23:47
1

O utilitário install é realmente projetado para criar arquivos! Você pode passar o conteúdo do arquivo via /dev/stdin (na maioria dos casos, no entanto, na maioria dos tipos de Linux, isso requer que /proc seja montado) ou fornecer outro arquivo de origem. Você pode definir a propriedade e as permissões.

echo "New file" | install -o 0644 -m 452452 -g dumbass /dev/stdin /var/www/index.html

como um exemplo bobo.

    
por 31.05.2016 / 00:08