script saber ruta programas por ejemplos directorio consola como comandos comando buscar basicos archivos archivo bash string path ps1

bash - saber - locate linux



Bash: PS1 personalizado con una buena ruta de directorio de trabajo (9)

¿Por qué no usar solo ${string:position:length} ? Puedes hacer ${string:-$max_chars} para tener los últimos ${max_chars} de la cadena.

tenga en cuenta el valor negativo

Estoy usando Ubuntu y estoy cansado de estas largas instrucciones en bash cuando estoy trabajando con una jerarquía de directorios profunda. Por lo tanto, me gustaría ajustar mi PS1 para acortar la parte del directorio de trabajo de la siguiente manera:

Actualmente tengo:

pajton@dragon:~/workspace/projects/project1/folder1/test$

y me gustaría tener:

pajton@dragon:~/workspace/.../folder1/test$

El truncamiento ocurriría si len ($ PWD) pasa el umbral dado. Quiero mantener siempre el primer componente de ruta y al menos un último componente de ruta. Luego, cuando el espacio lo permita, agregue más componentes desde la derecha.

Esto es lo que tengo actualmente. Funciona, pero: 1) no mantiene el primer componente de ruta, 2) no respeta la ruta de corte en los límites:

pwd_length=14 pwd_symbol="..." newPWD="${PWD/#$HOME/~}" if [ $(echo -n $newPWD | wc -c | tr -d " ") -gt $pwd_length ] then newPWD="...$(echo -n $PWD | sed -e "s/.*/(./{$pwd_length/}/)//1/")" else newPWD="$(echo -n $PWD)" fi

Y el resultado:

pajton@dragon:...sth/folder1/sample$

¡Gracias por adelantado!


Además de la solución bash- PROMPT_DIRTRIM utilizando PROMPT_DIRTRIM , puede probar $(pwd | tail -c16) , que es un poco más simple que la mayoría de las otras respuestas, pero solo da los últimos 16 caracteres del directorio actual. Por supuesto, reemplace 16 por el número que desee.


Considere este script usando awk en lugar de sed para su caso:

pwd_length=14 pwd_symbol="..." newPWD="${PWD/#$HOME/~}" if [ $(echo -n $newPWD | wc -c | tr -d " ") -gt $pwd_length ] then newPWD=$(echo -n $newPWD | awk -F ''/'' ''{ print $1 "/" $2 "/.../" $(NF-1) "/" $(NF)}'') fi PS1=''${newPWD}$ ''

Para su ejemplo de directorio ~/workspace/projects/project1/folder1/test , hace PS1 como: ~/workspace/.../folder1/test

ACTUALIZAR

La solución anterior configurará su mensaje, pero como señaló en su comentario, NO cambiará PS1 dinámicamente cuando cambie de directorio. Así que aquí está la solución que configurará PS1 dinámicamente cuando cambie directorios.

Coloque estas 2 líneas en su archivo .bashrc:

export MYPS=''$(echo -n "${PWD/#$HOME/~}" | awk -F "/" ''"''"''{ if (length($0) > 14) { if (NF>4) print $1 "/" $2 "/.../" $(NF-1) "/" $NF; else if (NF>3) print $1 "/" $2 "/.../" $NF; else print $1 "/.../" $NF; } else print $0;}''"''"'')'' PS1=''$(eval "echo ${MYPS}")$ ''

if (NF > 4 && length($0) > 14) condición en awk solo aplicará manejo especial cuando su directorio actual tenga más de 3 directorios profundos Y si la longitud de $PWD es más de 14 caracteres de lo contrario y mantendrá PS1 como $PWD .

por ejemplo: si el directorio actual es ~/workspace/projects/project1$ entonces PS1 será ~/workspace/projects/project1$

El efecto de arriba en .bashrc será el siguiente en tu PS1:

~$ cd ~/workspace/projects/project1/folder1/test ~/workspace/.../folder1/test$ cd .. ~/workspace/.../project1/folder1$ cd .. ~/workspace/.../project1$ cd .. ~/.../projects$ cd .. ~/workspace$ cd .. ~$

Observe qué tan rápido cambia cuando cambio de directorios. Avísame si esto no es lo que querías.


Esto es lo que uso basado en las soluciones de anubhava. Establece el prompt y el título de Windows. La secuencia de comandos awk es más legible, por lo que se puede ajustar / personalizar fácilmente.

Doblará el camino si tiene más de 16 caracteres y 4 niveles de profundidad. Además, también indicará en el ... cuántos directorios se han plegado, para que tenga una idea de qué tan profunda es la ruta, es decir: ~/usr/..4../path2/path1 indica que se han plegado 4 niveles.

# define the awk script using heredoc notation for easy modification MYPSDIR_AWK=$(cat << ''EOF'' BEGIN { FS = OFS = "/" } { sub(ENVIRON["HOME"], "~"); if (length($0) > 16 && NF > 4) print $1,$2,".." NF-4 "..",$(NF-1),$NF else print $0 } EOF ) # my replacement for /w prompt expansion export MYPSDIR=''$(echo -n "$PWD" | awk "$MYPSDIR_AWK")'' # the fancy colorized prompt: [0 user@host ~]$ # return code is in green, user@host is in bold/white export PS1=''[/[/033[1;32m/]$?/[/033[0;0m/] /[/033[0;1m/]/u@/h/[/033[0;0m/] $(eval "echo ${MYPSDIR}")]$ '' # set x/ssh window title as well export PROMPT_COMMAND=''echo -ne "/033]0;${USER}@${HOSTNAME%%.*} $(eval "echo ${MYPSDIR}")/007"''

Esto es lo que parece en acción. El verde 0 es el código de retorno del último comando:


No tan diferente de las soluciones anteriores. Sin embargo, tal vez un poco más legible / editable. Sin embargo, no hay solución para el límite del nombre de la carpeta, solo se centra en la longitud del aviso.

### SET MY PROMPT ### if [ -n "$PS1" ]; then # A temporary variable to contain our prompt command NEW_PROMPT_COMMAND='' pwd_short=${PWD/#$HOME//~}; if [ ${#pwd_short} -gt 53 ]; then TRIMMED_PWD=${pwd_short: 0: 25}...${pwd_short: -25} else TRIMMED_PWD=${pwd_short} fi '' # If there''s an existing prompt command, let''s not # clobber it if [ -n "$PROMPT_COMMAND" ]; then PROMPT_COMMAND="$PROMPT_COMMAND;$NEW_PROMPT_COMMAND" else PROMPT_COMMAND="$NEW_PROMPT_COMMAND" fi # We''re done with our temporary variable unset NEW_PROMPT_COMMAND # Set PS1 with our new variable # /h - hostname, /u - username PS1=''/u@/h: $TRIMMED_PWD/$ '' fi

agregado al archivo .bashrc. Todas las partes del aviso se actualizan correctamente. La primera parte se acorta si está en su directorio de inicio. Ejemplo:

usuario @ computadora: ~ / misc / projs / solardrivers ... src / com / mycompany / handles $


Otro enfoque, sigue usando sed y awk para generar el mensaje. Esto convertirá su directorio $HOME en ~, le mostrará su directorio raíz, su nivel más bajo (directorio actual) y su elemento principal, separados por .. para cada directorio intermedio.

Dentro de tu .bashrc (o .bash_profile en OS X):

function generate_pwd { pwd | sed s.$HOME.~.g | awk -F"/" '' BEGIN { ORS="/" } END { for (i=1; i<= NF; i++) { if ((i == 1 && $1 != "") || i == NF-1 || i == NF) { print $i } else if (i == 1 && $1 == "") { print "/"$2 i++ } else { print ".." } } }'' } export PS1="/$(generate_pwd) -> "

La secuencia de comandos usa awk''s built en la variable NF (número de campos) y las variables posicionales ( $1, $2 ... ) para imprimir cada campo (nombre de directorio) separado por la variable ORS (separador de registros de salida). Se colapsan los directorios internos en .. en su mensaje.

Ejemplo de uso:

~/ -> cd Documents/ ~/Documents/ -> cd scripts/ ~/Documents/scripts/ -> cd test1/ ~/../scripts/test1/ -> cd test2 ~/../../test1/test2/ -> pwd /Users/Brandon/Documents/scripts/test1/test2 ~/../../test1/test2/ -> cd test3/ ~/../../../test2/test3/ -> cd test4/ ~/../../../../test3/test4/ -> pwd /Users/Brandon/Documents/scripts/test1/test2/test3/test4 ~/../../../../test3/test4/ -> cd /usr/ /usr/ -> cd local/ /usr/local/ -> cd etc/ /usr/local/etc/ -> cd openssl/ /usr/../etc/openssl/ -> cd private/ /usr/../../openssl/private/ ->


Para las personas que buscan una solución mucho más simple y no necesitan el nombre del primer directorio en la ruta, Bash tiene soporte integrado para esto usando la variable PROMPT_DIRTRIM . De la documentación :

PROMPT_DIRTRIM

Si se establece en un número mayor que cero, el valor se usa como el número de componentes de directorio pendientes para retener cuando se expande la cadena de solicitud / w y / W (consulte Impresión de una solicitud). Los caracteres eliminados se reemplazan con puntos suspensivos.

Por ejemplo:

~$ mkdir -p a/b/c/d/e/f ~$ cd a/b/c/d/e/f ~/a/b/c/d/e/f$ export PROMPT_DIRTRIM=2 ~/.../e/f$ PROMPT_DIRTRIM=3 ~/.../d/e/f$

Desventaja: depende del nivel del directorio, no de la longitud de la ruta, lo cual es posible que no desee.

Upside: es muy simple. Simplemente agregue export PROMPT_DIRTRIM=2 a su .bashrc .


echo -n $PWD | sed -re "s|(~?/[^/]*/).*(.{$pwd_length})|/1.../2|"

sed con -r solo por conveniencia, permite omitir la barra invertida antes de paréntesis, y "|" como delimitador solo por conveniencia, porque queremos usar la barra dentro del comando. Supongo que su casa se muestra como ~ también, por lo que ~ / foo / bar / baz / debe terminar en ~ / foo /.../ baz, y / foo / bar / baz / as /foo..../baz /.

Entonces tomamos un ~ opcional, seguido de una barra inclinada, un nombre, una barra como / 1, luego algo, y luego el resto como / 2.


generatePwd(){ set -- "`pwd | sed -e s.${HOME}.~.g`" IFS="/"; declare -a array=($*) srt="" count=0 for i in ${!array[@]}; do # echo ${array[i]} - $i/${#array[@]} if [[ $i == 0 ]]; then srt+="" elif [[ $i == $((${#array[@]}-1)) ]] || [[ $i == $((${#array[@]}-2)) ]]; then srt+="/${array[i]}" else count=$((${count}+1)) fi done if [[ $count != 0 ]]; then srt="${array[0]}/.$count.$srt" else srt="${array[0]}$srt" fi echo "${srt}" }

exportar PS1

PS1="/$(generatePwd)"

Consola

$ ~/.3./machine-learning/deep-learning-computer-vision