44 votes

Créer un fichier et son répertoire parent

Je sais que touch crée un fichier :

touch test1.txt

mais comment puis-je créer un fichier et son chemin d'accès complet ?

par exemple, mon bureau ne contient rien :

~/Desktop/$ ls
~/Desktop/$

et je veux créer 1.txt dans ~/Desktop/a/b/c/d/e/f/g/h/1.txt . Est-ce que je peux le faire avec une simple commande comme :

$ touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt

au lieu de créer manuellement le chemin complet et de créer ensuite le fichier ?

55voto

Byte Commander Points 99026

touch n'est pas en mesure de créer des répertoires, vous avez besoin de mkdir pour cela.

Cependant, mkdir a l'utilité -p / --parents qui crée une structure de répertoire complète.

De man mkdir :

   -p, --parents
          no error if existing, make parent directories as needed

La commande dont vous avez besoin dans votre situation spécifique est donc la suivante :

mkdir -p ~/Desktop/a/b/c/d/e/f/g/h/ && touch ~/Desktop/a/b/c/d/e/f/g/h/1.txt

Si vous pensez que vous en aurez besoin plus souvent et que vous ne voulez pas taper le chemin deux fois à chaque fois, vous pouvez également créer une fonction Bash ou un script pour cela.

  • Fonction Bash (ajouter cette ligne à ~/.bashrc pour qu'il soit disponible en permanence pour l'utilisateur, sinon il disparaîtra à nouveau lorsque vous quitterez votre terminal) :

    touch2() { mkdir -p "$(dirname "$1")" && touch "$1" ; }

    Il peut être utilisé de la manière suivante :

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
  • Bash script (le stocker dans /usr/local/bin/touch2 en utilisant sudo pour le rendre disponible pour tous les utilisateurs, sinon en ~/bin/touch2 pour l'utilisateur uniquement) :

    #!/bin/bash
    mkdir -p "$(dirname "$1")" &&
        touch "$1"

    N'oubliez pas de rendre le script exécutable à l'aide de chmod +x /PATH/TO/touch2 .

    Vous pouvez ensuite l'exécuter comme suit :

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt

13voto

Sergiy Kolodyazhnyy Points 97292

On peut utiliser install avec la commande -D drapeau.

bash-4.3$ install -D /dev/null mydir/one/two

bash-4.3$ tree mydir
mydir
 one
     two

1 directory, 1 file
bash-4.3$ 

Si nous avons plusieurs fichiers, nous pourrions envisager d'utiliser une liste d'éléments (attention, n'oubliez pas de citer les éléments avec des espaces) et d'itérer sur ces éléments :

bash-4.3$ for i in mydir/{'subdir one'/{file1,file2},'subdir 2'/{file3,file4}} ; do 
> install -D /dev/null "$i"
> done
bash-4.3$ tree mydir
mydir
 one
    two
 subdir 2
    file3
    file4
 subdir one
     file1
     file2

Ou encore avec un tableau :

bash-4.3$ arr=( mydir/{'subdir one'/{file1,file2},'subdir 2'/{file3,file4}} )
bash-4.3$ for i in "${arr[@]}"; do  install -D /dev/null "$i"; done
bash-4.3$ tree mydir
mydir
 one
    two
 subdir 2
    file3
    file4
 subdir one
     file1
     file2

6voto

mkdir -p parent/child && touch $_/file.txt

3voto

Purkhalo Alex Points 279

À cette fin, vous pouvez créer votre propre fonction, comme dans l'exemple ci-dessous :

$ echo 'mkfile() { mkdir -p "$(dirname "$1")" && touch "$1" ;  }' >> ~/.bashrc
$ source ~/.bashrc
$ mkfile ./fldr1/fldr2/file.txt

Tout d'abord, nous insérons une fonction à la fin du fichier ~/.bashrc à l'aide de la commande echo. L'option -p de la fonction permet de créer des dossiers imbriqués, comme fldr2 dans notre exemple. Enfin, nous mettons à jour le fichier avec la commande source et exécutons la commande mkfile récemment créée

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X