¿Cuáles son los usos prácticos de pushd
y popd
cuando hay una ventaja de usar estos dos comandos sobre cd
y cd -
?
EDIT : Estoy buscando algunos ejemplos prácticos de usos para estos dos comandos o razones para mantener la pila con directorios (cuando se completa la pestaña, cd -
, alias para acortar cd ..
, etc.).
Respuesta
pushd
, popd
y dirs
son elementos de shell que le permite manipular la pila de directorios . Esto se puede usar para cambiar de directorio pero volver al directorio del que vino.
Por ejemplo
inicie con los siguientes directorios:
$ pwd /home/saml/somedir $ ls dir1 dir2 dir3
pushd to dir1
$ pushd dir1 ~/somedir/dir1 ~/somedir $ dirs ~/somedir/dir1 ~/somedir
El comando dirs
confirma que ahora tenemos 2 directorios en la pila. dir1
y el directorio original, somedir
. NOTA: Nuestro » actual » directorio es ~/somedir/dir1
.
empujado a ../dir3 (porque ahora «estamos dentro de dir1
)
$ pushd ../dir3 ~/somedir/dir3 ~/somedir/dir1 ~/somedir $ dirs ~/somedir/dir3 ~/somedir/dir1 ~/somedir $ pwd /home/saml/somedir/dir3
dirs
muestra que ahora tenemos 3 directorios en la pila. dir3
, dir1
y somedir
. Fíjate en la dirección. Cada directorio nuevo se agrega a la izquierda. Cuando comenzamos a abrir directorios desactivado, también vendrán de la izquierda.
cambiar manualmente los directorios a ../dir2
$ cd ../dir2 $ pwd /home/saml/somedir/dir2 $ dirs ~/somedir/dir2 ~/somedir/dir1 ~/somedir
Ahora comience a abrir directorios
$ popd ~/somedir/dir1 ~/somedir $ pwd /home/saml/somedir/dir1
Observe que regresamos a dir1
.
Pop de nuevo …
$ popd ~/somedir $ pwd /home/saml/somedir
Y «volvemos a donde empezamos, somedir
.
Puede resultar un poco confuso, pero el jefe de la stac k es el directorio en el que se encuentra actualmente. Por lo tanto, cuando volvamos a somedir
, aunque dirs
muestra esto:
$ dirs ~/somedir
Nuestra pila de hecho está vacía.
$ popd bash: popd: directory stack empty
Comentarios
- Gracias, entiendo totalmente el concepto de pila y cómo funcionan estos comandos. Sin embargo, ‘ estoy buscando algunas razones prácticas para mantener la pila con directorios (cuando tienes la función de completar tabuladores,
cd -
, alias para acortarcd ..
, etc.). - A menudo uso
pushd
&popd
en scripts porque me salvan de tener que recordar de dónde vengo, siempre puedopopd
para volver de donde vine. Normalmente hagopopd >/dev/null 2>&1
para silenciarlo. Yo uso cd- todos los días en mi caparazón. También hay algunos otros consejos para ahorrar tiempo en este artículo: thegeekstuff.com/2008/10/… . - @Garrett: ninguno que pueda concebir.
- @Garrett @slm ya que
cd -
solo rastrea el último directorio, imagino que lo haría Es posible que tenga problemas si llama a una función que también cambia de directorio internamente. en ese caso, la función terminaría restableciéndose, en su directorio actual, no en el directorio al que desea regresar. pushd / popd es el método más seguro. Nota: no he ‘ t probado mi teoría. - ¿Por qué no volver a
~/somedir/dir3
después del primerpopd
?
Responder
Hay un caso de uso realmente útil para los comandos pushd
y popd
para trabajar con varias carpetas simultáneamente.
Puede navegar por la pila muy fácilmente, ya que está enumerada. Es decir, puede tener varias carpetas de trabajo a su disposición durante el trabajo.
Vea un ejemplo simple a continuación.
Primero, creemos una estructura de carpeta de ejemplo.
user@vb:~$ mkdir navigate user@vb:~/navigate$ mkdir dir1 user@vb:~/navigate$ mkdir dir2 user@vb:~/navigate$ mkdir dir3
Luego, puede agregar todas sus carpetas a la pila :
user@vb:~/navigate$ pushd dir1/ ~/navigate/dir1 ~/navigate user@vb:~/navigate/dir1$ pushd ../dir2/ ~/navigate/dir2 ~/navigate/dir1 ~/navigate user@vb:~/navigate/dir2$ pushd ../dir3/ ~/navigate/dir3 ~/navigate/dir2 ~/navigate/dir1 ~/navigate
Puede buscarlo por:
user@vb:~/navigate/dir3$ dirs -v 0 ~/navigate/dir3 1 ~/navigate/dir2 2 ~/navigate/dir1 3 ~/navigate
Para navegar de forma segura, debe agregar la última carpeta (cero) dos veces, ya que siempre se reescribirá:
user@vb:~/navigate/dir3$ pushd . user@vb:~/navigate/dir3$ dirs -v 0 ~/navigate/dir3 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate
Ahora, puede saltar a través de estas carpetas y trabajar con apilar como con alias para las carpetas.Supongo que la siguiente parte se explica por sí misma:
user@vb:~/navigate/dir3$ cd ~4 user@vb:~/navigate$ dirs -v 0 ~/navigate 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate user@vb:~/navigate$ cd ~3 user@vb:~/navigate/dir1$ dirs -v 0 ~/navigate/dir1 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate user@vb:~/navigate/dir1$ touch text.txt user@vb:~/navigate/dir1$ cp text.txt ~2 user@vb:~/navigate/dir1$ ls ~2 text.txt user@vb:~/navigate/dir1$ dirs -v 0 ~/navigate/dir1 1 ~/navigate/dir3 2 ~/navigate/dir2 3 ~/navigate/dir1 4 ~/navigate
Consejo adicional es crear un alias para dirs -v
.
Por ejemplo:
# In ~/.bashrc alias dirs="dirs -v"
Comentarios
Respuesta
Un caso de uso simple para usar la pila de directorios, lo que no se puede hacer con solo cd es :
pushd .
agrega el directorio actual XX a la pila dirs
. Luego, puede moverse usando cd
, y para volver a XX, simplemente haga popd
independientemente de qué tan «lejos» se encuentre el árbol de directorios (puede saltar sobre varios niveles, de lado, etc.). Especialmente útil en scripts bash.
Comentarios
- Creo que esta es la característica que aprovecho más a menudo. Debido a que
pushd
/popd
funcionan independientemente decd
, puede usarlos como un marcador quecd -
. - Para mí, esto no es cierto. Cada vez que uso cd, mi pila cambia.
- Oh, eso fue por usar zsh, cuando cambio a bash, funciona bien
- Esta es la única respuesta sustantiva con respecto a una comparación con cd -, en mi opinión. En cuanto a si pushd foo; < cambio de directorio aleatorio >; popd vale más que a = foo; cd $ a; < cambio de directorio aleatorio >; cd $ a … Para los scripts, puedo ver una pequeña conveniencia sintáctica en el primero (pushd), pero una enorme mejora en la claridad en el segundo (¡variables [explícitas]!). Para una sesión interactiva, creo que asumiría que mi jerarquía de directorios está organizada correctamente en primer lugar, y si me pierdo, simplemente haga cd ~ / back / to / evidente / ruta.
- @HarendraSingh no ‘ ¿No tiene configurado
AUTO_PUSHD
? Hará quecd
se comporte comopushd
, lo desarmará y ‘ volverá a » comportamiento normal «.
Respuesta
pushd
y popd
le permiten manipular los directorios en la pila.
Cuando pushd
un directorio, coloca el directorio actual en la pila y cambia el directorio al especificado como parámetro.
popd
le permitirá volver al directorio en la pila.
Si repite, el recorrido del directorio se conservará y podrá volver a los directorios guardados en orden inverso al que los guardó.
Respuesta
Para bash , básicamente: en lugar de usar cd, uno puede use pushd
para cambiar de directorio. Con uso práctico: el historial de directorios visitados se guarda (correctamente: apilado) y se puede cambiar entre ellos:
pushd /home; pushd /var; pushd log
Para ver la pila, use dirs
y para una navegación más sencilla (para obtener los números de las » entradas de pila » use:
dirs -v
Resultado:
me@myhost:/home$ dirs -v 0 /home 1 /var 2 /tmp
Ahora utilice estos números con cd
y ~
como:
cd ~1
Pero estos números ahora están reorganizados y colocan » 0 » cambiará, así que solo pushd
el directorio en la posición superior dos veces (o use un maniquí en la posición 0) como:
me@myhost:/home$ dirs -v 0 /home 1 /home 2 /var 3 /tmp
Ahora 1..3 mantendrá su posición
(Para liberar el directorio actual de la pila / eliminarlo del historial, use popd
)
Responder
El pushd / popd es un concepto tan simple que me tomó un tiempo comprenderlo ya que la gente tiende a enseñarlo definiendo estos comandos como comandos que» manipulan la pila de directorios «, lo que en mi opinión es muy confuso.
Lo veo de otra manera:
pushd [nombre_carpeta] – guardará un cd en [folder_name] y documentará el destino que es [folder_name] en una pila de directorios mientras que el directorio superior en la pila siempre estará el directorio actual en el que se encuentra
popd – primero lo ingresará el registro del directorio que está en la parte superior de la pila y luego elimine la documentación (elimínela de la pila de directorios)
dirs – Imprimirá la pila de directorios (se puede tratar como el directorio Db donde la entrada más a la izquierda es el directorio actual (parte superior de la pila)
Entonces, los 2 casos de uso más populares son:
Caso de uso 1: Navegación usando pushd y popd
root@mypc:/main/$ ls dir1 dir2 dir3 dir4 root@mypc:/main/$ dirs # prints the current stack /main root@mypc:/main/$ pushd dir1 # Will cd to dir1 and document dir1 in dir stack, stack is now: /main/dir1 /main root@mypc:/main/dir1$ # I am now in /main/dir1 root@mypc:/main/dir1$ # Now let"s go wild and document whatever I want root@mypc:/main/dir1$ pushd ../dir2 root@mypc:/main/dir2$ # Woo I am in /main/dir2 root@mypc:/main/dir2$ pushd ../dir3 root@mypc:/main/dir3$ # Woo I am in /main/dir3 root@mypc:/main/dir3$ pushd ../dir4 root@mypc:/main/dir4$ # Woo I am in /main/dir4 root@mypc:/main/dir4$ dirs # Now dir stack is: /main/dir4 /main/dir3 /main/dir2 /main/dir1 /main
Digamos ¡Hice lo anterior ya que me gustaría volver a esas carpetas que documenté!
Tenga en cuenta que si hago un cd manualmente, afectaré la entrada de la pila de directorios superior (que siempre es el directorio actual)
root@mypc:/main/dir4$ cd .. # Now dir stack is: # (note that /main appear in the leftmost as well which is the top of the stack) /main /main/dir3 /main/dir2 /main/dir1 /main root@mypc:/main$
Naveguemos hacia atrás ahora:
root@mypc:/main$ popd root@mypc:/main$ # Still in /main since it was at the top of the dir stack root@mypc:/main$ dirs # Stack is now: /main/dir3 /main/dir2 /main/dir1 /main root@mypc:/main$ popd root@mypc:/main/dir3$ popd # Woo in dir3 now, about to navigate to dir2 root@mypc:/main/dir2$ popd # Woo in dir2, about to navigate to dir1 root@mypc:/main/dir1$ dirs # Stack is now: /main
De nuevo, puedo documentar cualquier directorio que desee y luego navegar manualmente a otro directorio, entonces podré volver fácilmente al directorio documentado que inserté en la pila.
Caso de uso 2: Navegando usando el índice de pila numérico
Digamos que presioné usando pushd dir4 dir3 dir2 dir1, ahora ejecutando dir -v mostrará:
root@mypc:/main$ dirs -v 0 /main/dir1 (this is the current dir you are in always) 1 /main/dir2 2 /main/dir3 3 /main/dir4
Ahora puede realizar cualquier operación de Linux que involucre directorios usando el índice de pila:
root@mypc:/main$ cp ~2/temp.txt ~3/new_temp.txt # this will run in the background, something like: # cp /main/dir2/temp.txt /main/dir3/new_temp.txt
Incluso puede eliminar un entrada de la pila de directorios:
root@mypc:/main$ popd ~4
Espero que usar las palabras «documentar» o pensar en la pila de directorios como una especie de Db simplifica el concepto!
Respuesta
En pocas palabras: cuando necesita navegar entre más de 2 directorios, generalmente varias veces hacia atrás & adelante, ya que cd -
simplemente no lo cortará con nada más allá de 2 carpetas.
Entonces, por ejemplo, en lugar de tratar de volver a encontrar rutas largas anteriores mirando el historial de su búfer o completando una ruta larga, simplemente apila las importantes y, si es necesario, se mueve convenientemente a ellas solo por su número. La rotación entre estructuras de directorios complejas y rutas largas se vuelve hábil y rápida.
Las funciones incorporadas también le permiten reordenar la pila o sacar los directorios que ya no necesita, lo que permite flexibilidad en su flujo de trabajo.
El apilamiento de directorios también se puede usar en scripts de manera similar para operaciones que abarcan varios directorios.
Respuesta
I Encontré el uso de dirs / popd / pushd un poco incómodo. Se me ocurrió mi solución personal en tcsh, agregando el siguiente código en .alias
foreach b (. , - 0 1 2 3 4 5 6 7 8 9 ) alias p$b "set a=`pwd`; echo $a >! ~/.mydir"$b alias cd$b "cd "`cat ~/.mydir"$b"`"" alias del$b "rm -v ~/.mydir"$b alias home$b "set a="~"; echo $a >! ~/.mydir"$b end alias cdl "grep / ~/.mydir*"
de esta manera puse un alias, por ejemplo, «p.» para guardar el directorio de trabajo actual en el archivo ~ / .mydir. y «cd.» para recuperar ese directorio cuando y donde quiera. «del.» elimina el archivo correspondiente; «home.» establece el directorio en el directorio de inicio (equivalente a cd; p.); «cdl» enumera cuáles son los directorios guardados. Tenga en cuenta que si usa ~ / Dropbox / .mydir $ b (o cualquier otro servicio en la nube como ej. ownCloud) en lugar de ~ / .mydir $ b obtienes una forma inteligente para usar sus directorios preferidos en diferentes cuentas y máquinas.
Responder
Usando cd
y cd -
le permite alternar entre sus dos directorios usados más recientemente. El tamaño de su «conjunto de trabajo de directorio» es dos.
Con pushd
, puede mantener una cantidad arbitrariamente grande de directorios en su conjunto de trabajo.
Utilizo pushd
la mayor parte del tiempo en lugar de cd
. Una vez que haya creado una pila de directorios activos con pushd directory_name
, podrá saltar entre ellos todo el día con pushd ~#
.
pushd dir1 pushd ../dir2 pushd /full/path/to/dir3 # There are now three directories in the stack. pushd ~3 pushd ~2 # The same three directories are still on the stack, # just in a different order.
Utilizo popd
rara vez, solo cuando quiero eliminar un directorio de la pila cuando sé que ya he terminado usando ese directorio.
Vaya al directorio y elimínelo de la pila:
popd ~2
Permanezca en el directorio actual y elimine otro directorio del pila:
popd +2
Terminas con un estilo de trabajo que es similar a tener múltiples ventanas de terminal o pestañas abiertas (una para cada directorio en el que estás «activamente funcionando), pero todo en una terminal.Esto ahorra espacio en la pantalla, además, debido a que todas las rutas de directorio están disponibles en un shell, puede hacer cosas como:
- copiar archivos entre directorios con los que está trabajando actualmente
- ver o editar archivos en otro directorio sin ir allí
Ejemplos:
cp ~2/myfile.txt ~4 less ~2/myfile.txt
En tcsh
(pero no bash
), incluso puede guardar su pila de directorios en un archivo y restaurarlo más tarde.
Guardar:
dirs -S ~/dirstack
Restaurar:
dirs -L ~/dirstack
De lo contrario, simplemente reemplace ~
en los bash
ejemplos con =
para usar en tcsh
.
pushd =2 popd =4 popd +1
Responder
Lo estoy usando así en mi bash_profile y .bashrc así
vi .bash_profile alias dirs="dirs -v" source d.sh :wq vi .bashrc alias dirs="dirs -v" :wq vi d.sh pushd ~/Documents/GIT/seiso-data pushd ~/Documents/GIT/ewe/EosRegistry pushd ~/Documents/GIT_LODGING/site-cookbooks pushd ~/Documents/CHEF_LODGING pushd . :wq
ayuda s yo salto entre los directorios más recientes usados en mi terminal. 🙂 Espero que te ayude a usar pushd en lugar de popd. Yo uso cd ~ stackednumber
dirs -c