Je me surprends à répéter beaucoup de:
mkdir longtitleproject cd longtitleproject
Existe-t-il un moyen de le faire en une seule ligne sans répéter le nom du répertoire? Je « m on bash here.
Commentaires
-
mcd
de unix.stackexchange.com/questions/6628/… - Connexes (mais plus générales): Exécutez deux commandes sur un argument (sans script) .
-
mkdir longtitleproject
puiscd !^
- A également été traité sur askubuntu.com/q/927463/295286 et askubuntu.com/q/249314/295286
Réponse
Cest le one-liner dont vous avez besoin. Aucune autre configuration requise:
mkdir longtitleproject && cd $_
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é dans man bash
:
_ At shell startup, set to the absolute pathname used to invoke the shell or shell script being executed as passed in the envi‐ ronment or argument list. Subsequently, expands to the last argument to the previous command, after expansion. Also set to the full pathname used to invoke each command executed and placed in the environment exported to that command. When check‐ ing mail, this parameter holds the name of the mail file cur‐ rently being checked."$_" is the last argument of the previous command.
Utilisez cd $_
pour récupérer le dernier argument ment de la commande précédente au lieu de cd !$
car cd !$
donne le dernier argument de la commande précédente dans lhistorique du shell :
cd ~/ mkdir folder && cd !$
vous vous retrouvez chez vous (ou ~ /)
cd ~/ mkdir newfolder && cd $_
vous vous retrouvez dans le nouveau dossier sous la maison !! (ou ~ / newfolder)
Commentaires
Réponse
Il ny a pas de commande intégrée, mais vous pouvez facilement écrire une fonction qui appelle mkdir
puis cd
:
mkcd () { mkdir "$1" cd "$1" }
Mettez ce code dans votre fichier ~/.bashrc
(ou ~/.kshrc
pour les utilisateurs ksh, ou ~/.zshrc
pour les utilisateurs zsh). Il définit une fonction appelée mkcd
. "$1"
sera remplacé par largument de la fonction lorsque vous lexécuterez.
Cette version simple présente plusieurs défauts:
- Vous ne pouvez pas créer une chaîne de sous-répertoires à la fois. Correction: passez loption
-p
àmkdir
. (Cela peut être souhaitable ou non, car cela augmente le risque quune faute de frappe ne soit pas détectée, par exemplemkcd mydierctory/newsub
créera volontiersmydierctory
etmydierctory/newsub
lorsque vous vouliez créernewsub
dans lemydirectory
.) - Si largument commence par
-
mais nest « pas seulement-
, alorsmkdir
etcd
linterpréteront comme une option. Si cest juste-
, alorscd
linterprétera comme signifiant$OLDPWD
. Si il « s+
suivi de 0 ou plusieurs chiffres, alorscd
dans zsh linterpré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 largument. Vous pouvez résoudre tous ces problèmes en ajoutant./
à largument sil sagit dun « chemin relatif. -
mkdir
ne suit pasCDPATH
, maiscd
le fait, donc si vous « avez définiCDPATH
à une valeur qui ne commence pas par.
(une configuration certes un peu inhabituelle), alorscd
peut vous amener dans un répertoire différent de celui qui vient dêtre créé.Lajout de./
aux chemins relatifs corrige ce problème¹ (cela fait ignorerCDPATH
). - Si
mkdir
échoue, il tente dexécutercd
. Correction: utilisez&&
pour séparer les deux commandes.
Encore assez simple:
mkcd () { case "$1" in /*) :;; *) set -- "./$1";; esac mkdir -p "$1" && cd "$1" }
Cette version a encore le potentiel de faire entrer cd
dans un répertoire différent de celui que mkdir
vient dêtre créé dans un cas darête: si largument de mkcd
contient ..
et passe par un lien symbolique. Par exemple, si le répertoire actuel est /tmp/here
et mylink
est un lien symbolique vers /somewhere/else
, puis mkdir mylink/../foo
crée /somewhere/else/foo
tandis que cd mylink/../foo
se transforme en foo
. Il ne suffit pas de rechercher des liens symboliques dans largument, car le shell suit également les liens symboliques dans son propre répertoire courant, donc cd /tmp/mylink; mkdir ../foo; cd ../foo
ne change pas dans le nouveau répertoire (/somewhere/else/foo
) mais en /tmp/foo
. Une solution à ce problème consiste à laisser le cd
résoudre tout ..
les composants du chemin en premier (cela na pas de sens dutiliser foo/..
si foo
ne le fait pas » t existent, donc mkdir
na jamais besoin de voir de ..
).
Nous arrivons à ce robuste quoique légèrement sanglant version:
mkcd () { case "$1" in */..|*/../) cd -- "$1";; # that doesn"t make any sense unless the directory already exists /*/../*) (cd "${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd -- "$1";; /*) mkdir -p "$1" && cd "$1";; */../*) (cd "./${1%/../*}/.." && mkdir -p "./${1##*/../}") && cd "./$1";; ../*) (cd .. && mkdir -p "${1#.}") && cd "$1";; *) mkdir -p "./$1" && cd "./$1";; esac }
(Exercice: pourquoi jutilise un sous-shell pour le premier cd
call?)
Si mkdir échoue, je veux être sûr de ne pas changer le répertoire actuel. Revenir en arrière avec cd – ou $ OLDPWD nest pas assez bon si le shell ne possède pas permission de changer dans son répertoire actuel. Aussi, appeler le cd met à jour OLDPWD, donc nous ne voulons le faire quune seule fois (ou restaurer OLDPWD).
Il existe également des moyens moins spécialisés pour ne pas avoir à retaper le mot de la ligne précédente:
- Tapez
cd
, puis Esc . (ou Alt + . ) pour insérer le dernier argument de la commande précédente. -
cd !$
exécutecd
sur le dernier argument de la commande précédente. - Appuyez sur Haut pour rappeler la ligne de commande précédente, puis modifiez-la pour changer
mkdir
encd
.
¹ attention cependant que cela ne fonctionne pas dans ksh93 depuis la u+
version , corrigé dans 93u + m / 1.0.0-alpha + d1483150 05/01/2021
Commentaires
- Merci! lEchap. me semble le plus pratique, fait la séquence de touches avoir un m spécial eaning?
- Il ‘ est juste le Bash (et hérité de
ksh
, et fonctionne également danszsh
) séquence pour » répéter le dernier mot de la commande précédente « . Je lutilise assez souvent. - @Gilles Je ‘ commence à penser que le » Gilles » le compte est en fait partagé par un panel dexperts. 😉
- @StephaneChazelas
/a/b/..//
fonctionnerait réellement mais pas/a/b/../c
. Fixé. Jai ‘ posé la question à un public plus large. -
mkcd() { mkdir -p "$1" && cd "$1"; }
ne ‘ t semble ê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
qui est ce qui a été créé (et ce à quoi je mattendais).bash
crée et change par erreur en/var/tmp/somewhere/foo
.
Réponse
Il ne mest jamais venu à lesprit de créer un script de ce comportement car jentre ce qui suit presque toutes les heures …
$ mkdir someDirectory<ENTER> $ cd !$
où bash remplace gentiment !$
par le dernier mot de la dernière ligne; cest-à-dire le nom de répertoire long que vous avez entré.
De plus, lachè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 TAB vous donnerait le nouveau répertoire sans le ré-entrer.
Bien que ce soit cool, bash vous permet pour écrire des tâches courantes comme le suggèrent les autres réponses, je pense quil est préférable dapprendre les fonctionnalités dédition de ligne de commande que bash a à offrir afin que lorsque vous travaillez sur une autre machine, vous ne manquiez pas le sucre syntaxique que vos scripts personnalisés fournissent.
Commentaires
- Y a-t-il un bon endroit pour en savoir plus sur les bizarreries de bash les plus importantes comme celle-ci?
- @ dominicbri7 En général vient sous » bash édition de la ligne de commande » Googler la même chose donne ce qui suit comme meilleur résultat web.mit.edu/gnu/doc/html/features_7.html Plus précisément,! $ est un exemple de Word Designator voir gnu.org/software /bash/manual/bashref.html#Word-Designators
Réponse
Si vous utilisez Oh mon Zsh, il ya « une commande appelée prendre qui fait exactement cela. Cela ressemblerait à quelque chose comme ça.
take myfolder
En fait, jai trouvé celui-ci par accident. Je viens de le regarder et il est répertorié sur cette astuce du wiki Oh My Zsh GitHub. Cest une commande assez utile, et apparemment très facile à créer soi-même.
Commentaires
- Je nai jamais connu
take
🙂 Parfait! btw – iTerm2 avec Oh My Zsh. Il y a en fait 3 réponses parfaites ici. Celle-ci, celle de @jes ú s-carrera, et la réponse sélectionnée. Dépend de votre configuration et de vos préférences.
Réponse
Selon Quelles personnalisations avez-vous effectuées sur votre profil shell pour augmenter la productivité? , voici comment procéder:
# make a directory and cd to it mcd() { test -d "$1" || mkdir "$1" && cd "$1" }
cela signifie que cela fonctionne aussi si le répertoire existe déjà.
Commentaires
- Loption
-p
de mkdir supprime les erreurs. - mcd est une commande déjà existante. Bien que ‘ ai juste donné un exemple, je lai moi-même utilisé comme ‘ est une lettre plus courte que mkcd.
- @Dharmit Shah: Quest-ce que la commande
mcd
existante? Quel package ou projet fournit cette commande? - mtools fournit la commande mcd. Sa page de manuel indique » La commande mcd est utilisée pour changer le répertoire de travail mtools sur le disque MS-DOS. »
Réponse
Ou vous pouvez simplement créer une courte variable à la volée et lutiliser deux fois x = longproject ; mkdir $x ; cd $x
– ce qui, je ladmets, est encore plus long que lutilisation dune fonction shellscript 🙂
Answer
Ceci est un chose simple à faire dans un script / une fonction bash. Jai créé un tutoriel très lisible et suffisamment documenté comprenant des scripts qui fonctionnent à la fois sur Linux et MacOS (cela sera également maintenu à lavenir).
Mon objectif pour la complexité du tutoriel est: écrit pour un public ciblé avec les seuls prérequis étant que lutilisateur a le pouls et sait lire langlais, veuillez donc nous faire part de vos commentaires si vous avez besoin daide.
https://github.com/craigopie/shellscripts
mcdir() { if [ $# -eq 0 ] || [ $1 = "-h" ] || [ $1 = "--help" ] then echo "Usage: [option...] {directory}" echo " -p, --path Create all directories in path " echo " -h, --help Shows this helpful information " echo return 0 fi ## create directory with a path if [ $1 = "-p" ] || [ $1 = "--path" ] then mkdir -p "$2" &>/dev/null if [ $? -gt 0 ] then echo "There was a problem creating your directory." return 1 fi cd "$2" &>/dev/null if [ $? -gt 0 ] then echo "Unable to change into that directory." return 1 fi return 0 fi ## create directory in this location mkdir "$1" &>/dev/null if [ $? -gt 0 ] then echo "There was a problem creating your directory." return 1 fi cd "$1" &>/dev/null if [ $? -gt 0 ] then echo "Unable to change into that directory." return 1 fi return 0 } export -f mcdir
Pour linstaller, vous en avez deux options:
- Tout dabord, ajoutez la fonction à votre fichier
.bashrc
. - La seconde consiste à ajouter le fichier à votre chemin puis recherchez le fichier dans votre fichier
.bash_profile
.
Encore une fois, le fichier README est très détaillé sur la façon de procéder.
Bonne chance!
Réponse
Voici « une légère variante qui mérite dêtre mentionnée:
function mkdir() { local dir=$1 command mkdir "$dir" && cd "$dir" }
Ajoutez ceci à vous ur ~/.bash_profile
et vous pouvez ensuite utiliser mkdir
comme dhabitude (une fois que vous « ve source
» d it), sauf que maintenant il exécutera la fonction ci-dessus plutôt que la commande standard mkdir
.
Remarque, cela ne valide pas lentrée selon la réponse de Gilles , mais montre comment vous pouvez (efficacement) remplacer les fonctions internes.
Depuis le docs (paraphrasant légèrement):
command mkdir [args]
exécutemkdir
avecargs
ignorant toute fonction shell nomméemkdir
. Seules les commandes internes du shell ou les commandes trouvées en recherchant le PATH sont exécutées. Sil existe une fonction shell nomméels
, lexécution decommand ls
dans la fonction exécutera la commande externels
au lieu dappeler la fonction récursivement
Je crois que builtin
obtient un résultat similaire à command
.
Commentaires
- vous devez absolument citer
$dir
- @Jeff, daccord, mais la réponse acceptée a toute la validation dont on aurait besoin.Je ‘ m viens de présenter lutilisation de
command
comme alternative.
Réponse
Ajout dune fonction dassistance à BASH, ZSH ou KSH
Créez la commande mkcd
dans votre environnement dans une ligne
echo -e "mkcd() {\n mkdir -p "$1" && cd $_\n}" >> ~/.${0//-/}rc && . ~/.${0//-/}rc
Réponse
Si vous utilisez Oh-my-zsh , la commande take
fera laffaire. Jetez un œil à la aide-mémoire .
Réponse
Simplement automatisé les réponses ci-dessus et créé un script exécutable unique:
fun=" mkcd () { mkdir -p -- "$1" && cd -P -- "$1" }" echo "$fun" >> ~/.bashrc
Copiez simplement ceci dans un nouveau fichier mkcd.sh
et exécutez-le une seule fois dans le terminal par bash mkcd.sh
. Ensuite, exécutez source ~/.bashrc
pour le faire fonctionner dans la session en cours.
Après cela, vous pouvez utiliser mkcd some_dir
pour créer et entrez directement dans ce répertoire.
Commentaires
- Vous suggérez décrire un script (dans un fichier) dont le seul but est dajouter au
~/.bashrc
fichier (avec une réponse qui a déjà été donnée)? Et comment suggérez-vous de créer ce scriptmkcd.sh
? Avec un éditeur, peut-être? Cela semble demander plus de travail que la simple modification de~/.bashrc
. Quel avantage cela a-t-il sur la réponse acceptée? ……………………………………………………………………… P.S. Cela échouera en raison de problèmes de citation, ce qui me dit que vous ne lavez même pas essayé vous-même. - Je suis désolé de le dire, mais oui, comme je lai écrit dans ma réponse, jai utilisé les réponses ci-dessus. Ça marche. Si vous ‘ ne me croyez pas, essayez-le. Et pour ne pas essayer, jai utilisé ma journée entière pour écrire de tels scripts en bash et python aujourdhui.
- Jai essayé ce que vous avez écrit. Cela ne fonctionne pas .
mkdir foo && cd foo
, ce qui nest ‘ t pratique.&& cd $_
puisque les clés sont si éloignées de la ligne daccueil, donc bien que techniquement correctes, elles ‘ ne sont pas ergonomiques. Japprécie le fait que ‘ ne dépend pas de lenvironnement et que ‘ est utile de le savoir. Merci!