Unix - créer un chemin de dossiers et de fichiers
Je sais que vous pouvez faire mkdir
pour créer un répertoire et touch
pour créer un fichier, mais il n'y a pas moyen de faire les deux opérations en une seule fois?
c'est à dire si je veux faire le ci-dessous 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
A quelqu'un de venir avec une fonction comme une solution pour cela?
- Trouvé ceci: stackoverflow.com/questions/1529946/...
- Si il est essentiel que la création du fichier et son répertoire atomique, vous devez écrire un fichier système qui offre à cette opération. Il n'est pas possible avec le standard des systèmes de fichiers Linux.
- Je comprends que cette question est maintenant de un an et demi d'existence, mais plusieurs réponses étaient récemment fusionné dans cette. Si vous avez besoin de ce genre de chose, très souvent, vous pouvez trouver ma réponse utile. (Je dirais plus utile que l'on a accepté la réponse, mais je ne suis pas la mendicité pour rep ici 🙂 )
- Trouvé ceci: stackoverflow.com/a/8722721/29182
- Q:"Comment dois-je faire X?" Un:"Voici comment le faire Y"
Vous devez vous connecter pour publier un commentaire.
Utilisation
&&
de combiner les deux commandes dans un shell de ligne:Note: Précédemment, j'ai recommandé l'utilisation de
;
de séparer les deux commandes, mais comme l'a souligné @trysis il est probablement préférable d'utiliser&&
dans la plupart des situations, car dans le casCOMMAND1
échoueCOMMAND2
ne sera pas exécutée soit. (Sinon, cela pourrait conduire à des problèmes que vous pourriez pas attendre.)&&
, comme avec;
, si la première commande échoue, la deuxième commande fonctionne toujours (et ne parviennent pas, trop, tant que ce répertoire n'existe pas encore). Avec&&
si la première commande échoue, la deuxième commande ne s'exécute pas.mkdir -p /my/other/path/here && touch $_/cpredthing.txt
. Le$_
se développe essentiellement au "dernier argument de la dernière commande exécutée".touch
a pris un-p
paramètre comme lamkdir
n'.Vous avez besoin de faire tous les répertoires parents en premier.
Si vous voulez faire preuve de créativité, vous pouvez faire une fonction:
Et ensuite l'utiliser comme n'importe quel autre commande:
&&
- Comment?supertouch "/tmp/abc/def ghi/jkl mno.txt"
et il a échoué. Toutes les commandesdirname
,mkdir
, ettouch
a donné erros.mktouch
il est.Le faire avec /usr/bin/install:
lorsque vous ne disposez pas d'un fichier source:
-D /dev/null
, ce qui est plus facile pour moi de m'en souvenir.vous pouvez le faire en deux étapes:
dirname -z "$@" | xargs -0 mkdir -p
au lieu de cela, pour des raisons de performances. (Arrêt de tapie, et joindre, pour Pete's sake! 😉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é en ligne.Comme toujours, si vous voulez voir ce que le résultat peut être, vous pouvez le tester en utilisant la
echo
de commande, comme suit:echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt
Qui sorties:
Comme un bonus, vous pouvez écrire plusieurs fichiers à la fois à l'aide attelle d'extension, par exemple:
De nouveau, totalement vérifiable avec
echo
:comme je l'ai vu et tester dans un unix forum cela résout le problème
pas besoin de
if then
états...vous pouvez le faire sur une seule ligne avec la
;
-- ou sur deux lignes -
-- le
-p
empêche d'erreur renvoie si le répertoire existe déjà (ce qui est ce que je suis venu ici à la recherche d' :))Dans la spéciale, mais ne sont pas rares) cas où vous êtes en essayant de recréer la même hiérarchie de répertoire,
cp --parents
peut être utile.Par exemple, si
/my/long
contient les fichiers source, etmy/other
existe déjà, vous pouvez le faire:si vous voulez simple avec seulement 1 param extrait de :
rm -rf
commandes. — †Qui est heures, en supposant que vous adhérer à un bon contrôle de version / politique de sauvegarde... sinon, il se pourrait bien mois.rm -rf
ne doit jamais être proposé sans explications et mises en garde.