¿Hay alguna forma en un shell de Unix (específicamente Ubuntu) de cambiar el directorio al directorio x que se imprimió desde el comando ls? Sé que puedes ordenar un directorio de varias maneras, pero ¿utilizar la salida de ls para obtener el directorio x?
Un caparazón de ejemplo:
$ ls
$ first_dir second_dir third_really_long_and_complex_dir
donde quiero pasar al tercer_really_long_and_complex_dir pasando 3 (o 2 en el formato de matriz adecuado). Sé que podría simplemente copiar y pegar, pero si ya estoy usando el teclado, sería más fácil escribir algo como "cdls 2" o algo así si conociera el índice.
ACTUALIZAR
Para cualquiera que todavía vea esto, creé esta pregunta cuando era realmente nuevo en Linux/bash y no me di cuenta de que existía la función de completar tabulaciones.
Respuesta1
El principal problema cd
en una sesión interactiva es que generalmente desea cambiar el directorio actual del shell que procesa el símbolo del sistema. Eso significa que iniciar un subshell (por ejemplo, un script) no ayudaría, ya que cualquier cd
llamada no afectaría al shell principal.
Sin embargo, dependiendo del shell que esté utilizando, es posible que pueda definir unfunciónpara hacer esto. Por ejemplo en fiesta:
function cdls() {
# Save the current state of the nullglob option
SHOPT=`shopt -p nullglob`
# Make sure that */ expands to nothing when no directories are present
shopt -s nullglob
# Get a list of directories
DIRS=(*/)
# Restore the nullblob option state
$SHOPT
# cd using a zero-based index
cd "${DIRS[$1]}"
}
Tenga en cuenta que en este ejemplo me niego absolutamente a analizar el resultado de ls
,por un número de razones. En lugar de eso, dejo que el shell recupere una lista de directorios (o enlaces a directorios)...
Dicho esto, sospecho que usar esta función (o cualquier cosa similar) es una muy buena manera de prepararse para un desastre enorme, como usarla rm
después de cambiar al directorio incorrecto. El autocompletado de nombres de archivos ya es bastante peligroso, sin necesidad de obligarte a hacerlo.contar...
Respuesta2
Tengo una función para esto:
función cdi. { IFS=$'\n' PÁGINA=${1:-1} LPP=${2:-11} primero=$(( 1 + LPP * PÁGINA - LPP )) último=$(( LPP * PÁGINA )) seleccione cd_into en $(find . -max Depth 1 -type d -printf "%P\n" |\ sed -n $primero,${último}p); hacer SALIR=-1; si [[ $RESPUESTA == n ]]; luego deje PÁGINA=PÁGINA+1; cdi. $PÁGINA $LPP ; SALIR=$? elif [[ $RESPUESTA == p ]]; luego deje PÁGINA=PÁGINA-1; cdi. $PÁGINA $LPP ; SALIR=$? elif [[ $RESPUESTA == m ]]; entonces sea LPP=LPP*2; cdi. $PÁGINA $LPP ; SALIR=$? elif [[ $RESPUESTA == l ]]; entonces sea LPP=LPP/2; cdi. $PÁGINA $LPP ; SALIR=$? elif [[ $RESPUESTA == q || $RESPUESTA == 0 ]];luego devuelve 0; fi si [ $SALIDA -eq 0 ]; luego devuelve 0; fi cd_into=${cd_into//\~/$INICIO} si [ -d "$cd_into" ];entonces cd "$cd_into"; devolver 0; demás echo "¡Ups! \`$cd_into' no es una carpeta (?)" fi hecho IFS desarmado }
Usar:
$cdi. 1) .mozilla.nuevo 3) .swt 5) tmp 7) .vim 9) .ssh 2) .crack-attack 4) Descargas 6) .Eterm 8) .frozen-bubble 10) .irssi Cual #?: