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?
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
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
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.