Je sais que vous pouvez faire mkdir
pour créer un répertoire et touch
pour créer un fichier, mais n'y a-t-il aucun moyen de faire les deux opérations en une seule fois?
c'est-à-dire 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 proposé une fonction pour contourner ce problème?
Réponses:
Utilisez
&&
pour combiner deux commandes dans une seule ligne de shell:Remarque: Auparavant, je recommandais d'utiliser
;
pour séparer les deux commandes, mais comme indiqué par @trysis, il est probablement préférable de l'utiliser&&
dans la plupart des situations, car en cas d'COMMAND1
échec,COMMAND2
il ne sera pas exécuté non plus. (Sinon, cela pourrait entraîner des problèmes auxquels vous ne vous attendiez peut-être pas.)la source
&&
, comme avec;
, si la première commande échoue, la deuxième commande sera toujours exécutée (et échouera aussi, car 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 pour devenir le "dernier argument de la dernière commande exécutée".touch
prendre un-p
paramètre comme lemkdir
fait.Vous devez d'abord créer tous les répertoires parents.
Si vous voulez faire preuve de créativité, vous pouvez créer une fonction :
Et puis utilisez-le comme n'importe quelle autre commande:
la source
&&
- Comment ça?supertouch "/tmp/abc/def ghi/jkl mno.txt"
et cela a échoué. Toutes les commandesdirname
,mkdir
ettouch
a donné erros.mktouch
c'est.Faites-le avec / usr / bin / install:
lorsque vous n'avez pas de fichier source:
la source
-D /dev/null
, ce qui est plus facile à retenir pour moi.Voici 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
echo
commande, comme ceci:echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt
Quelles sorties comme:
En prime, vous pouvez écrire plusieurs fichiers à la fois en utilisant l'extension d'accolades, par exemple:
Encore une fois, totalement testable avec
echo
:la source
la source
dirname -z "$@" | xargs -0 mkdir -p
place, pour des raisons de performance. (Arrêtez de vous cacher, et rejoignez, pour l'amour de Pete! ;-)vous pouvez le faire en deux étapes:
la source
la source
comme je l'ai vu et testé dans un forum unix, cela résout le problème
la source
pas besoin de
if then
déclarations ... vous pouvez le faire sur une seule ligne usign;
- ou sur deux lignes -
- l'
-p
erreur empêche les retours si le répertoire existe déjà (c'est ce que je suis venu chercher ici :))la source
Dans le cas spécial (mais pas rare) où vous essayez de recréer la même hiérarchie de répertoires, cela
cp --parents
peut être utile.Par exemple, si
/my/long
contient les fichiers source etmy/other
existe déjà, vous pouvez le faire:la source
si vous voulez simple avec un seul extrait de paramètre:
la source
rm -rf
commandes. - † Autrement dit, des heures , en supposant que vous adhériez à une politique de contrôle / sauvegarde de version raisonnable ... sinon, cela pourrait prendre des mois.rm -rf
ne doit jamais être suggéré sans explications et avertissements appropriés.