Je me retrouve à répéter beaucoup de:
mkdir longtitleproject
cd longtitleproject
Est-il possible de le faire en une seule ligne sans répéter le nom du répertoire? Je suis sur bash ici.
bash
shell
command-line
méthodofaction
la source
la source
mcd
de unix.stackexchange.com/questions/6628/…mkdir longtitleproject
ensuitecd !^
Réponses:
Il n'y a pas de commande intégrée, mais vous pouvez facilement écrire une fonction qui appelle
mkdir
alorscd
:Mettez ce code dans votre
~/.bashrc
fichier (ou~/.kshrc
pour les utilisateurs de ksh, ou~/.zshrc
pour les utilisateurs de zsh). Il définit une fonction appeléemkcd
."$1"
sera remplacé par l'argument de la fonction lorsque vous l'exécutez.Cette version simple a plusieurs défauts:
-p
option àmkdir
. (Cela peut être souhaitable ou non, car cela augmente le risque qu'une faute de frappe ne soit pas détectée, par exemplemkcd mydierctory/newsub
créera avec bonheurmydierctory
etmydierctory/newsub
quand vous avez l'intention de créernewsub
à l'intérieur de l'existantmydirectory
.)-
mais n'est pas juste-
, alorsmkdir
etcd
l'interprétera comme une option. Si c'est juste-
, alorscd
l'interprétera comme signifiant$OLDPWD
. S'il est+
suivi d'au moins 0 chiffres,cd
in zsh l'interprétera comme un index dans la pile de répertoires. Vous pouvez résoudre le premier problème, mais pas les deux autres, en passant--
avant l'argument. Vous pouvez résoudre tous ces problèmes en ajoutant un préfixe./
à l'argument s'il s'agit d'un chemin relatif.mkdir
ne suit pasCDPATH
, mais lecd
fait, donc si vous avez définiCDPATH
une valeur qui ne commence pas par.
(une configuration certes quelque peu inhabituelle), puiscd
peut vous amener à un autre répertoire que celui qui vient d'être créé. Le fait de prévoir./
des chemins relatifs résout ce problème (cela entraîneCDPATH
l’ignorance).mkdir
échoue, il essaie de s'exécutercd
. Correction: utilisez&&
pour séparer les deux commandes.Encore assez simple:
Cette version a toujours le potentiel de faire
cd
aller dans un répertoire différent de celui quimkdir
vient d'être créé dans un cas particulier: si l'argument àmkcd
contient..
et passe par un lien symbolique. Par exemple, si le répertoire en cours est/tmp/here
etmylink
est un lien symbolique vers/somewhere/else
,mkdir mylink/../foo
crée/somewhere/else/foo
alors lacd mylink/../foo
modification enfoo
. Il ne suffit pas de rechercher des liens symboliques dans l'argument, car le shell suit également les liens symboliques dans son propre répertoire actuel. Par conséquent,cd /tmp/mylink; mkdir ../foo; cd ../foo
ne changez pas dans le nouveau répertoire (/somewhere/else/foo
) mais dans/tmp/foo
. Une solution à ce problème consiste à laisser l’cd
intégré résoudre tous les..
composants du chemin d’abord (cela n’a aucun sens de l’utiliserfoo/..
sifoo
n'existe pas, doncmkdir
jamais besoin d'en voir..
).Nous arrivons à cette version robuste si légèrement gore:
(Exercice: pourquoi est-ce que j'utilise un sous-shell pour le premier
cd
appel?)Il existe également des moyens moins spécialisés pour ne pas avoir à retaper le mot de la ligne précédente:
cd
, puis Esc .(ou Alt+ .) pour insérer le dernier argument de la commande précédente.cd !$
s'exécutecd
sur le dernier argument de la commande précédente.mkdir
encd
.la source
ksh
, et fonctionne égalementzsh
) pour "répéter le dernier mot de la commande précédente". Je l'utilise assez souvent./a/b/..//
fonctionnerait réellement mais pas/a/b/../c
. Fixé. J'ai posé la question à un public plus large.mkcd() { mkdir -p "$1" && cd "$1"; }
ne semble pas être un problème dans (mon instance de) zsh.mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd
(inclut la configuration et) affiche/tmp/here/foo
ce qui a été créé (et ce à quoi je m'attendais).bash
crée par erreur et passe à/var/tmp/somewhere/foo
.C'est le one-liner dont vous avez besoin. Aucune autre configuration nécessaire:
La
$_
variable, en bash, est le dernier argument donné à la commande précédente. Dans ce cas, le nom du répertoire que vous venez de créer. Comme expliqué dansman bash
:Utilisez
cd $_
pour récupérer le dernier argument de la commande précédente au lieu decd !$
parce quecd !$
donne le dernier argument de la commande précédente dans l'historique du shell :vous finissez chez vous (ou ~ /)
vous vous retrouvez dans newfolder sous home !! (ou ~ / nouveau dossier)
la source
mkdir foo && cd foo
, ce qui n’est pas pratique.Je n'aurais jamais imaginé créer un scénario pour ce comportement, car j'entre ce qui suit presque toutes les heures ...
où bash substitue gentiment
!$
le dernier mot de la dernière ligne; c'est-à-dire le nom de répertoire long que vous avez entré.En outre, l'achèvement du nom de fichier est votre ami dans de telles situations. Si votre nouveau répertoire était le seul fichier du dossier, un double rapide TABvous donnerait le nouveau répertoire sans le saisir à nouveau.
Bien que ce soit cool que bash vous permette de créer des tâches courantes comme le suggèrent les autres réponses, je pense qu'il est préférable d’apprendre les fonctionnalités de modification de la ligne de commande que bash a à offrir afin que, lorsque vous travaillez sur une autre machine, vous ne manquiez pas de syntaxe. sucre que vos scripts personnalisés fournissent.
la source
Selon quelles personnalisations avez-vous effectuées sur votre profil de coque pour augmenter la productivité? , voici comment je le fais:
cela signifie que cela fonctionne aussi si le répertoire existe déjà.
la source
-p
option mkdir supprimera les erreurs.mcd
commande existante ? Quel paquet ou projet fournit cette commande?Si vous utilisez Oh My Zsh, il existe une commande appelée take qui fait exactement cela. Cela ressemblerait à quelque chose comme ça.
J'ai effectivement trouvé celui-ci par accident. Je viens de regarder et il est répertorié sur cette astuce du wiki Oh My Zsh GitHub. C'est une commande assez utile, et apparemment très facile à créer vous-même.
la source
take
:) Parfait! btw - iTerm2 avec Oh My Zsh. Il y a en fait 3 réponses parfaites ici. Celui-ci, celui de @ jesús-carrera et la réponse sélectionnée. Cela dépend de votre configuration et de vos préférences.Ou vous pouvez simplement créer une variable courte à la volée et l'utiliser deux fois
x = longproject ; mkdir $x ; cd $x
- ce qui, je l'avoue, est encore plus long que l'utilisation d'une fonction shellscript :)la source
Voici une légère variante qui mérite d'être mentionnée:
Ajoutez ceci à votre
~/.bash_profile
et vous pourrez alors utilisermkdir
normalement (une fois que vous en aurez besoinsource
), sauf que maintenant, la fonction ci-dessus sera exécutée plutôt que lamkdir
commande standard .Notez que cela ne valide pas les entrées conformément à la réponse acceptée par Gilles , mais montre comment vous pouvez (efficacement) écraser les éléments intégrés.
D'après la documentation (en paraphrasant légèrement):
Je crois que
builtin
réalise un résultat similaire àcommand
.la source
$dir
command
comme une alternative.Ajout de la fonction d'assistance à BASH, ZSH ou KSH
Créer une
mkcd
commande pour votre environnement en une seule lignela source
J'ai fait un script qui crée le répertoire, puis les cd, puis je lui ai donné un alias. Et voici un résumé où je le décris.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
la source
Juste automatisé les réponses ci-dessus et fait un script exécutable une fois:
Il suffit de copier ceci dans un nouveau fichier
mkcd.sh
et de ne l'exécuter qu'une seule fois dans le terminalbash mkcd.sh
. Puis exécutez-lesource ~/.bashrc
pour le faire fonctionner dans la session en cours.Après cela, vous pouvez utiliser
mkcd some_dir
pour créer et entrer directement dans ce répertoire.la source
~/.bashrc
fichier (avec une réponse déjà donnée)? Et comment suggérez-vous de créer cemkcd.sh
script? Avec un éditeur, peut-être? Cela ressemble à plus de travail que juste l'édition~/.bashrc
. Quel avantage cela at-il sur la réponse acceptée? ………………………………………………………………… PS Cela échouera à cause de certains problèmes, ce qui me dit que vous ne l'avez même pas essayé vous-même.