Me encuentro repitiendo mucho de:
mkdir longtitleproject
cd longtitleproject
¿Hay alguna manera de hacerlo en una línea sin repetir el nombre del directorio? Estoy de fiesta aquí.
bash
shell
command-line
método de acción
fuente
fuente
mcd
de unix.stackexchange.com/questions/6628/…mkdir longtitleproject
entoncescd !^
Respuestas:
No hay un comando incorporado, pero puede escribir fácilmente una función que llame a
mkdir
continuacióncd
:Ponga este código en su
~/.bashrc
archivo (o~/.kshrc
para usuarios de ksh, o~/.zshrc
para usuarios de zsh). Define una función llamadamkcd
."$1"
será reemplazado por el argumento de la función cuando la ejecutes.Esta versión simple tiene varios defectos:
-p
opción amkdir
. (Esto puede o no ser deseable, ya que aumenta el riesgo de que un error tipográfico pase desapercibido, por ejemplo,mkcd mydierctory/newsub
se creará felizmentemydierctory
ymydierctory/newsub
cuando se pretende crearnewsub
dentro de lo existentemydirectory
).-
, pero no es justo-
, entoncesmkdir
ycd
lo interpretará como una opción. Si es justo-
, entoncescd
lo interpretará en el sentido$OLDPWD
. Si es+
seguido por 0 o más dígitos,cd
en zsh lo interpretará como un índice en la pila de directorios. Puede solucionar el primer problema, pero no los otros dos, pasando--
antes del argumento. Puede solucionar todos estos problemas anteponiendo./
el argumento si es una ruta relativa.mkdir
no sigueCDPATH
, perocd
sí, así que si ha establecidoCDPATH
un valor que no comienza con.
(una configuración ciertamente inusual),cd
puede llevarlo a un directorio diferente al que acaba de crear. Anteponer./
rutas relativas soluciona esto (haceCDPATH
que se ignore).mkdir
falla, intenta ejecutarsecd
. Solución: se usa&&
para separar los dos comandos.Todavía bastante simple:
Esta versión todavía tiene el potencial de hacer que
cd
vaya a un directorio diferente del quemkdir
acaba de crear en un caso extremo: si el argumentomkcd
contiene..
y pasa a través de un enlace simbólico. Por ejemplo, si el directorio actual es/tmp/here
ymylink
es un enlace simbólico/somewhere/else
,mkdir mylink/../foo
crea/somewhere/else/foo
mientras quecd mylink/../foo
cambia afoo
. No es suficiente buscar enlaces simbólicos en el argumento, porque el shell también rastrea enlaces simbólicos en su propio directorio actual, por locd /tmp/mylink; mkdir ../foo; cd ../foo
que no cambia al nuevo directorio (/somewhere/else/foo
) sino a/tmp/foo
. Una solución para esto es dejar que elcd
incorporado resuelva todos los..
componentes de la ruta primero (no tiene sentido usarfoo/..
sifoo
no existe, por lo quemkdir
nunca necesita ver ninguno..
).Llegamos a esta versión robusta aunque un poco sangrienta:
(Ejercicio: ¿por qué estoy usando un subshell para la primera
cd
llamada?)También hay formas menos especializadas de no tener que volver a escribir la palabra de la línea anterior:
cd
, luego Esc .(o Alt+ .) para insertar el último argumento del comando anterior.cd !$
se ejecutacd
en el último argumento del comando anterior.mkdir
acd
.fuente
ksh
, y también funcionazsh
) para "repetir la última palabra del comando anterior". Lo uso con bastante frecuencia./a/b/..//
realmente funcionaría pero no/a/b/../c
. Fijo. He planteado la pregunta a un público más amplio.mkcd() { mkdir -p "$1" && cd "$1"; }
no parece ser un problema en (mi instancia 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
(incluye la configuración y) muestra/tmp/here/foo
cuál es lo que se creó (y lo que esperaba).bash
erróneamente crea y cambia a/var/tmp/somewhere/foo
.Esta es la línea que necesita. No se necesita otra configuración:
La
$_
variable, en bash, es el último argumento dado al comando anterior. En este caso, el nombre del directorio que acaba de crear. Como se explica enman bash
:Use
cd $_
para recuperar el último argumento del comando anterior en lugar decd !$
porquecd !$
da el último argumento del comando anterior en el historial del shell :terminas en casa (o ~ /)
terminas en una nueva carpeta debajo de casa !! (o ~ / nueva carpeta)
fuente
mkdir foo && cd foo
, lo cual no es útil.Nunca se me habría ocurrido escribir este comportamiento porque escribo lo siguiente casi cada hora ...
donde bash amablemente sustituye
!$
con la última palabra de la última línea; es decir, el nombre de directorio largo que ingresó.Además, la finalización del nombre de archivo es su amigo en tales situaciones. Si su nuevo directorio fuera el único archivo en la carpeta, un doble rápido TABle daría el nuevo directorio sin tener que volver a ingresarlo.
Aunque es genial que bash le permita crear secuencias de comandos de tareas tan comunes como sugieren las otras respuestas, creo que es mejor aprender las características de edición de línea de comandos que bash tiene para ofrecer para que cuando trabaje en otra máquina no se pierda la sintaxis azúcar que proporcionan sus scripts personalizados.
fuente
Según ¿Qué personalizaciones ha realizado en su perfil de shell para aumentar la productividad? así es como lo hago:
significa que también funciona si el directorio ya existe.
fuente
-p
opción de mkdir suprimirá los errores.mcd
comando existente ? ¿Qué paquete o proyecto proporciona este comando?Si usa Oh My Zsh, hay un comando llamado take que hace exactamente esto. Se vería algo así.
En realidad encontré este por accidente. Acabo de mirar y aparece en este truco del wiki Oh My Zsh GitHub. Es un comando bastante útil, y aparentemente muy fácil de crear.
fuente
take
:) ¡Perfecto! por cierto - iTerm2 con Oh My Zsh. En realidad, hay 3 respuestas perfectas aquí. Este, el de @ jesús-carrera, y la respuesta seleccionada. Depende de su configuración y preferencia.O simplemente podría crear una variable corta sobre la marcha y usarla dos veces
x = longproject ; mkdir $x ; cd $x
, lo que admito es aún más largo que usar una función shellscript :)fuente
Aquí hay una ligera variante que vale la pena mencionar:
Agregue esto a su
~/.bash_profile
y luego puede usarlomkdir
normalmente (una vez que lo hayasource
hecho), excepto que ahora ejecutará la función anterior en lugar delmkdir
comando estándar .Tenga en cuenta que esto no valida la entrada según la respuesta aceptada por Gilles , sino que demuestra cómo puede (efectivamente) anular las incorporaciones.
De los documentos (parafraseando ligeramente):
Creo que
builtin
logra un resultado similar acommand
.fuente
$dir
command
como alternativa.Agregar función auxiliar a BASH, ZSH o KSH
Crea
mkcd
comandos para tu entorno en una líneafuente
Hice un script que crea el directorio y luego los cd's, luego le di un alias. Y aquí hay un resumen donde lo describo.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
fuente
Simplemente automaticé las respuestas anteriores e hice un script ejecutable único:
Simplemente copie esto en un nuevo archivo
mkcd.sh
y ejecútelo solo una vez en la terminalbash mkcd.sh
. Luego, ejecutesource ~/.bashrc
para que funcione en la sesión actual.Después de esto, puede usar
mkcd some_dir
para crear e ingresar directamente en ese directorio.fuente
~/.bashrc
archivo (con una respuesta que ya se ha dado)? ¿Y cómo sugieres crear estemkcd.sh
script? ¿Con un editor, tal vez? Esto parece más trabajo que solo editar~/.bashrc
. ¿Qué ventaja tiene esto sobre la respuesta aceptada? ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... PD: Esto fallará debido a problemas de citas, lo que me dice que ni siquiera lo ha intentado usted mismo.