Existe-t-il une ligne unique qui me permet de créer un répertoire et de sy déplacer en même temps?

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

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

  • Pourquoi diable celui-ci nest pas la réponse acceptée
  • @JSmyth Je suis daccord , cest un one-liner qui utilise la fonctionnalité native du shell
  • Je pense que lOP essaie déviter dutiliser les deux commandes. Cette réponse est (presque) aussi valable que de faire mkdir foo && cd foo, ce qui nest ‘ t pratique.
  • Le PO est demander un one-liner qui ne ‘ t nécessite de répéter le nom du répertoire, et cest tout
  • Par les votes positifs, ‘ est évident que de nombreuses personnes trouvent cette réponse utile. Je ‘ Je vais expliquer pourquoi je nai ‘ pas sélectionné cette réponse: Je ‘ m très susceptible de mal saisir && 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!

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 exemple mkcd mydierctory/newsub créera volontiers mydierctory et mydierctory/newsub lorsque vous vouliez créer newsub dans le mydirectory.)
  • Si largument commence par - mais nest « pas seulement -, alors mkdir et cd linterpréteront comme une option. Si cest juste -, alors cd linterprétera comme signifiant $OLDPWD. Si il « s + suivi de 0 ou plusieurs chiffres, alors cd 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 pas CDPATH, mais cd le fait, donc si vous « avez défini CDPATH à une valeur qui ne commence pas par . (une configuration certes un peu inhabituelle), alors cd 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 ignorer CDPATH).
  • Si mkdir échoue, il tente dexécuter cd. 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écute cd 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 en cd.

¹ 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 dans zsh) 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

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écute mkdir avec args ignorant toute fonction shell nommée mkdir. 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ée ls, lexécution de command ls dans la fonction exécutera la commande externe ls 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 script mkcd.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 .

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *