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.
mkdir longtitleproject
ensuitecd !^
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.
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
alors cd
:
mkcd () {
mkdir "$1"
cd "$1"
}
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ée mkcd
. "$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 exemple mkcd mydierctory/newsub
créera avec bonheur mydierctory
et mydierctory/newsub
quand vous avez l'intention de créer newsub
à l'intérieur de l'existant mydirectory
.)-
mais n'est pas juste -
, alors mkdir
et cd
l'interprétera comme une option. Si c'est juste -
, alors cd
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 pas CDPATH
, mais le cd
fait, donc si vous avez défini CDPATH
une valeur qui ne commence pas par .
(une configuration certes quelque peu inhabituelle), puis cd
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îne CDPATH
l’ignorance).mkdir
échoue, il essaie de s'exé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 toujours le potentiel de faire cd
aller dans un répertoire différent de celui qui mkdir
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
et mylink
est un lien symbolique vers /somewhere/else
, mkdir mylink/../foo
crée /somewhere/else/foo
alors la cd mylink/../foo
modification en foo
. 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’utiliser foo/..
sifoo
n'existe pas, donc mkdir
jamais besoin d'en voir ..
).
Nous arrivons à cette version robuste si légèrement gore:
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 est-ce que j'utilise un sous-shell pour le premier cd
appel?)
Si mkdir échoue, je veux être sûr de ne pas changer le répertoire actuel. Revenir avec cd - ou $ OLDPWD ne suffit pas si le shell n’est pas autorisé à changer de répertoire. De plus, l'appel de cd met à jour OLDPWD, nous ne voulons donc le faire qu'une 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:
cd
, puis Esc .(ou Alt+ .) pour insérer le dernier argument de la commande précédente.cd !$
s'exécute cd
sur le dernier argument de la commande précédente.mkdir
en cd
.ksh
, et fonctionne également zsh
) 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:
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 de la commande précédente au lieu de cd !$
parce que cd !$
donne le dernier argument de la commande précédente dans l'historique du shell :
cd ~/
mkdir folder && cd !$
vous finissez chez vous (ou ~ /)
cd ~/
mkdir newfolder && cd $_
vous vous retrouvez dans newfolder sous home !! (ou ~ / nouveau dossier)
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 ...
$ mkdir someDirectory<ENTER>
$ cd !$
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.
Selon quelles personnalisations avez-vous effectuées sur votre profil de coque pour augmenter la productivité? , voici comment je le fais:
# 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à.
-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.
take myfolder
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.
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.
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 à votre ~/.bash_profile
et vous pourrez alors utiliser mkdir
normalement (une fois que vous en aurez besoin source
), sauf que maintenant, la fonction ci-dessus sera exécutée plutôt que la mkdir
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):
command mkdir [args]
s'exécutemkdir
enargs
ignorant toute fonction shell nomméemkdir
. Seules les commandes internes au shell ou les commandes trouvées en effectuant une recherche dans le PATH sont exécutées. S'il existe une fonction shell nomméels
, son exécutioncommand ls
exécutera la commande externels
au lieu d'appeler la fonction de manière récursive.
Je crois que builtin
réalise un résultat similaire à command
.
$dir
command
comme une alternative.
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
Juste automatisé les réponses ci-dessus et fait un script exécutable une fois:
fun='
mkcd ()
{
mkdir -p -- "$1" && cd -P -- "$1"
}'
echo "$fun" >> ~/.bashrc
Il suffit de copier ceci dans un nouveau fichier mkcd.sh
et de ne l'exécuter qu'une seule fois dans le terminal bash mkcd.sh
. Puis exécutez-le source ~/.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.
~/.bashrc
fichier (avec une réponse déjà donnée)? Et comment suggérez-vous de créer ce mkcd.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.
mcd
de unix.stackexchange.com/questions/6628/…