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?

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
    

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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.