Créer un fichier et son répertoire parent

19

Je sais que cette touchcommande 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 simple commande comme:

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

au lieu de créer manuellement le chemin d'accès complet, puis de créer le fichier?

MA Heshmat Khah
la source

Réponses:

23

touchn'est pas en mesure de créer des répertoires, vous en avez besoin mkdir.

Cependant, mkdira l' option -p/ utile --parentsqui crée une structure de répertoires complète.

De man mkdir:

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

Ainsi, 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 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 (ajoutez cette ligne pour la ~/.bashrcmettre à la disposition de votre utilisateur de manière persistante, sinon elle disparaîtra de nouveau lorsque vous quitterez 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 en /usr/local/bin/touch2utilisant sudo pour le rendre disponible pour tous les utilisateurs, sinon ~/bin/touch2pour votre 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.

    Après cela, vous pouvez également l'exécuter comme ceci:

    touch2 ~/Desktop/a/b/c/d/e/f/g/h/1.txt
    
Byte Commander
la source
puis-je modifier la touch commande d' origine et y ajouter un commutateur -p?
MA Heshmat Khah
3
@HeshmatKhah Cela devrait être possible, mais il n'est pas recommandé d'observer les exécutables système avec vos propres scripts ou fonctions. Vous pouvez utiliser le nom touch-p(pas d'espace!) Au lieu de touch2, si vous préférez le "p", mais je n'essaierais pas de remplacer la commande d'origine.
Byte Commander
1
Notez que vous pouvez également utiliser la suppression des suffixes au lieu de cela dirname, c'est-à-dire que vous pouvez le faire mkdir -p "${1%/}" && touch "$1", de la même manière que askubuntu.com/a/928544/295286
Sergiy Kolodyazhnyy
7

On peut utiliser la installcommande avec -Dindicateur.

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

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 bien 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
Sergiy Kolodyazhnyy
la source
Avec cette approche, le nouveau fichier obtient des autorisations exécutables par défaut. Pour lui donner les mêmes autorisations qu'il obtiendrait au toucher, on peut utiliserinstall -m 644 -D /dev/null <filepath>
ricab
1

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

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

Purkhalo Alex
la source