web-dev-qa-db-fra.com

Pourquoi n'y a-t-il aucune commande shell pour créer des fichiers?

Attention, s'il vous plaît:

Je suis non Demander comment créer un fichier de la ligne de commande!


J'ai utilisé touch pour faire des dossiers pendant des années sans faire attention que son objectif principal est autre chose. Si on veut créer un fichier de la ligne de commande, il y a tellement de possibilités:

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

Et je suis sûr qu'il y en a plus.

Mais le fait est, aucune des commandes ci-dessus n'est conçue pour la création de fichiers. Par exemple, man touch suggère que cette commande est de changer les horodatages de fichier. Pourquoi un système d'exploitation n'est-il pas aussi complet que UNIX (ou Linux) ayant une commande uniquement conçue pour créer des fichiers?

28
Pouya

Je dirais parce que c'est à peine nécessaire de créer un fichier vide que vous ne remplirez pas le contenu immédiatement sur la ligne de commande ou dans les scripts Shell.

Il n'y a absolument aucun avantage à créer d'abord un fichier, puis à utiliser la redirection d'E/S pour écrire dans le fichier si vous pouvez le faire en une étape.

Dans ces cas où vous voulez vraiment créer un fichier vide et laisser cela, je dirais que > "${file}" ne pouvait pas être brifer et plus élégant.

TL; DR: Il n'existe pas, car la création de fichiers vides n'a souvent aucune utilisation et, dans les cas, il existe déjà une myriade d'options disponibles pour atteindre cet objectif.

Sur une note latérale, l'utilisation de touch fonctionne uniquement si le fichier n'existe pas, tandis que les options à l'aide de la redirection tronqueront toujours le fichier, même si elle existe (tellement techniquement, ces solutions ne sont pas identiques). > foo est la méthode préférée car elle enregistre un fork et echo -n devrait être évité en général car il est hautement inutilisable.

39
Adrian Frühwirth

La réponse de Adrian Frühwirth est juste sur. Je voulais juste ajouter qu'il existe une commande spécifiquement écrite pour créer des fichiers: 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.

Constituée, mktemp 's Le travail n'est pas de créer un fichier avec un nom spécifique, il s'agit simplement de créer un fichier . Cependant, comme vous l'avez déjà dit, il y a tellement de moyens plus efficaces et élégants de créer des fichiers avec un nom donné qui fournissant une commande pour cela serait inutile.

Cela dit, vous avez aussi truncate et fallocate Le but essentiel est de créer des fichiers. Ils ont simplement une approche plus sophistiquée. Il n'y aura jamais de programme simple qui fait ce que > file fait car il n'y a aucun moyen que ce soit mieux que > file.

16
terdon

La plupart des outils de coque de base ne sont pas conçus pour tout objectif très spécifique du tout. La plupart des outils de coque de base sont conçus uniquement pour interagir avec d'autres pour atteindre votre objectif. Ou peut-être que cela devrait être dit que la plupart des outils ne font qu'une chose très fondamentale, quelle que soit la manière dont ils pourraient être combinés pour atteindre un objectif.

: >./file

Cela crée un fichier vide. Ou tronque un fichier existant comme vous le ferez. Vous pouvez:

set -o noclobber

pour éviter toute possibilité de ce dernier cas, sauf si vous:

: >|./file

Vous pouvez obtenir un comportement similaire à touch avec:

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

Excepté : ne mettra pas à jour le modtime d'un fichier car il n'est pas modifié.

Démo

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

SORTIR

-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

NE TOUCHEZ PAS

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

SORTIR

-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
11
mikeserv

L'utilitaire install est réellement conçu pour créer des fichiers! Vous pouvez transmettre le contenu du fichier via /dev/stdin (Dans la plupart des cas, cependant, sur la plupart des saveurs de Linux, cela nécessite que /proc est monté) ou fournissez un autre fichier source. Vous pouvez définir la propriété et les autorisations.

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

comme exemple idiot.

1
Otheus