131 votes

Unix - créer le chemin des dossiers et des fichiers

Je sais que tu peux le faire mkdir pour créer un répertoire et touch pour créer un fichier, mais n'y a-t-il pas moyen de faire les deux opérations en une seule fois ?

Par exemple, si je veux faire ce qui suit lorsque le dossier other n'existe pas :

cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

Erreur :

cp: cannot create regular file `/my/other/path/here/cpedthing.txt': No such file or directory

Quelqu'un a-t-il trouvé une fonction pour contourner ce problème ?

149voto

evotopid Points 4085

Utilisez && pour combiner deux commandes dans une seule ligne du shell :

COMMAND1 && COMMAND2
mkdir -p /my/other/path/here/ && touch /my/other/path/here/cpedthing.txt

Note : Précédemment, j'ai recommandé l'utilisation de ; pour séparer les deux commandes, mais comme l'a fait remarquer @trysis, il est probablement préférable d'utiliser && dans la plupart des situations, car en cas COMMAND1 échoue COMMAND2 ne sera pas non plus exécuté. (Sinon, cela pourrait conduire à des problèmes auxquels vous ne vous attendiez peut-être pas).

88voto

Jonathon Reinhart Points 40535

Vous devez d'abord créer tous les répertoires parents.

FILE=./base/data/sounds/effects/camera_click.ogg

mkdir -p "$(dirname "$FILE")" && touch "$FILE"

Si vous voulez être créatif, vous pouvez faire une fonction :

mktouch() {
    if [ $# -lt 1 ]; then
        echo "Missing argument";
        return 1;
    fi

    for f in "$@"; do
        mkdir -p -- "$(dirname -- "$f")"
        touch -- "$f"
    done
}

Et ensuite, utilisez-la comme n'importe quelle autre commande :

mktouch ./base/data/sounds/effects/camera_click.ogg ./some/other/file

28voto

Ivan Dives Points 397

Faites-le avec /usr/bin/install :

install -D /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt

lorsque vous n'avez pas de fichier source :

install -D <(echo 1) /my/other/path/here/cpedthing.txt

15voto

Sgnl Points 1267

C'est ce que je ferais :

mkdir -p /my/other/path/here && touch $_/cpredthing.txt

Ici, le $_ est une variable qui représente le dernier argument de la commande précédente que nous avons exécutée en ligne.

Comme toujours, si vous voulez voir ce que pourrait être la sortie, vous pouvez la tester en utilisant la fonction echo comme ceci :

echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt

Qui sort comme :

mkdir -p /code/temp/other/path/here
touch /code/temp/other/path/here/cpredthing.txt

En prime, vous pouvez écrire plusieurs fichiers à la fois en utilisant l'expansion des accolades, par exemple :

mkdir -p /code/temp/other/path/here &&
touch $_/{cpredthing.txt,anotherfile,somescript.sh}

Encore une fois, totalement testable avec echo :

mkdir -p /code/temp/other/path/here
touch /code/temp/other/path/here/cpredthing.txt /code/temp/other/path/here/anotherfile /code/temp/other/path/here/somescript.sh

13voto

Javier Points 33134
#!/bin/sh
for f in "$@"; do mkdir -p "$(dirname "$f")"; done
touch "$@"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X