web-dev-qa-db-fra.com

Créer un fichier et son répertoire parent

Je sais que la commande touch crée un fichier:

touch test1.txt

mais comment puis-je créer un fichier et son chemin 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. Puis-je le faire avec une commande simple comme:

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

au lieu de créer manuellement le chemin complet, puis de créer le fichier?

15
M.A. Heshmat Khah

touch ne peut pas créer de répertoires, vous avez besoin de mkdir pour cela.

Cependant, mkdir a l'option utile -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

Donc, la commande dont vous avez besoin dans votre situation spécifique est:

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 en avoir besoin plus souvent et que vous ne souhaitez pas taper le chemin deux fois à chaque fois, vous pouvez également créer une fonction Bash ou un script.

  • Fonction Bash (ajoutez cette ligne à ~/.bashrc pour la laisser à la disposition de votre utilisateur, sinon elle disparaîtra à la sortie de votre terminal):

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

    Il peut être simplement utilisé comme ceci:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
  • Script Bash (stockez-le dans /usr/local/bin/touch2 en utilisant Sudo pour le rendre disponible pour tous les utilisateurs, sinon dans ~/bin/touch2 pour vos utilisateurs 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.

    Après cela, vous pouvez aussi le lancer comme ceci:

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

On peut utiliser la commande install avec l'indicateur -D.

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 (note, n'oubliez pas de citer les éléments avec des espaces) et de les parcourir:

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 alternativement avec 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
5

Pour cela, vous pouvez créer votre propre fonction, 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 les dossiers imbriqués, tels que fldr2 à partir de notre exemple. Enfin, nous mettons à jour le fichier avec la commande source et exécutons éventuellement la commande mkfile récemment créée.

0
Purkhalo Alex