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

mcdde unix.stackexchange.com/questions/6628/…mkdir longtitleprojectentoncescd !^Respuestas:
No hay un comando incorporado, pero puede escribir fácilmente una función que llame a
mkdircontinuacióncd:Ponga este código en su
~/.bashrcarchivo (o~/.kshrcpara usuarios de ksh, o~/.zshrcpara 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:
-popció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/newsubse creará felizmentemydierctoryymydierctory/newsubcuando se pretende crearnewsubdentro de lo existentemydirectory).-, pero no es justo-, entoncesmkdirycdlo interpretará como una opción. Si es justo-, entoncescdlo interpretará en el sentido$OLDPWD. Si es+seguido por 0 o más dígitos,cden 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.mkdirno sigueCDPATH, perocdsí, así que si ha establecidoCDPATHun valor que no comienza con.(una configuración ciertamente inusual),cdpuede llevarlo a un directorio diferente al que acaba de crear. Anteponer./rutas relativas soluciona esto (haceCDPATHque se ignore).mkdirfalla, intenta ejecutarsecd. Solución: se usa&¶ separar los dos comandos.Todavía bastante simple:
Esta versión todavía tiene el potencial de hacer que
cdvaya a un directorio diferente del quemkdiracaba de crear en un caso extremo: si el argumentomkcdcontiene..y pasa a través de un enlace simbólico. Por ejemplo, si el directorio actual es/tmp/hereymylinkes un enlace simbólico/somewhere/else,mkdir mylink/../foocrea/somewhere/else/foomientras quecd mylink/../foocambia 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 ../fooque no cambia al nuevo directorio (/somewhere/else/foo) sino a/tmp/foo. Una solución para esto es dejar que elcdincorporado resuelva todos los..componentes de la ruta primero (no tiene sentido usarfoo/..sifoono existe, por lo quemkdirnunca necesita ver ninguno..).Llegamos a esta versión robusta aunque un poco sangrienta:
(Ejercicio: ¿por qué estoy usando un subshell para la primera
cdllamada?)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 ejecutacden el último argumento del comando anterior.mkdiracd.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/foocuál es lo que se creó (y lo que esperaba).basherró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
-popción de mkdir suprimirá los errores.mcdcomando 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_profiley luego puede usarlomkdirnormalmente (una vez que lo hayasourcehecho), excepto que ahora ejecutará la función anterior en lugar delmkdircomando 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
builtinlogra un resultado similar acommand.fuente
$dircommandcomo alternativa.Agregar función auxiliar a BASH, ZSH o KSH
Crea
mkcdcomandos 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.shy ejecútelo solo una vez en la terminalbash mkcd.sh. Luego, ejecutesource ~/.bashrcpara que funcione en la sesión actual.Después de esto, puede usar
mkcd some_dirpara crear e ingresar directamente en ese directorio.fuente
~/.bashrcarchivo (con una respuesta que ya se ha dado)? ¿Y cómo sugieres crear estemkcd.shscript? ¿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.