![ls: muestra el nombre del directorio cuando solo uno coincide con el patrón](https://rvso.com/image/168781/ls%3A%20muestra%20el%20nombre%20del%20directorio%20cuando%20solo%20uno%20coincide%20con%20el%20patr%C3%B3n.png)
Cuando se usa ls
para mostrar archivos que coinciden con un patrón, muestra los nombres de los directorios con el contenido si hay varias coincidencias, pero si solo hay una coincidencia, omite el nombre del directorio. Aquí hay un ejemplo:
example % ls
bar barbados foo
example % ls b*
bar:
1 2
barbados:
1 2
example % ls f*
1 2
En el ejemplo, solicitar todos los archivos que comienzan con b*
coincide con dos directorios y el resultado muestra los nombres de ambos directorios y su contenido.
Cuando solicito, f*
el resultado muestra el contenido del único directorio coincidente, pero omite el nombre del directorio.
¿Cómo puedo configurar ls
para mostrar el nombre del directorio coincidente en el caso de que coincida con un solo directorio?
Respuesta1
Una posible solución podría ser una función contenedora:
dls() {
if [ "$#" -eq 1 ] && [ -d "$1" ]; then
printf '%s:\n' "$1"
fi
ls -- "$@"
}
- La función anterior no aceptará ninguna opción para pasar como argumento.
- Simplemente comprueba si:
- solo hay un argumento
- el argumento es un directorio
Si esas dos condiciones son verdaderas, imprima el nombre del directorio antes de enumerar su contenido.
% dls f*
foo:
1 2
Con algunas printf
implementaciones, puede reemplazar %s
con %q
para que el nombre del directorio se componga de manera similar a como ls
lo hacen las versiones recientes de GNU cuando contiene espacios en blanco u otros caracteres especiales.
Respuesta2
Usando sus ejemplos, cuando ejecuta ls b*
, el shell se expande b*
a bar barbados
, por lo que realmente ejecuta ls bar barbados
. Cuandols
tiene varios argumentos, si alguno de ellos es directorio, imprime el nombre seguido de la lista de archivos en el directorio.
Cuando ejecuta ls f*
, el shell expande el f*
archivo foo
, por lo que realmente ejecuta ls foo
. Cuando ls
tiene un solo argumento, si ese argumento es un directorio, imprime la lista de archivos en el directorio (sin el nombre del directorio).
No existe lo que yo llamaría una "buena" manera de hacer ls
lo que quieres (al menos no que yo sepa, alguien más podría saberlo mejor). Una forma "menos que buena" sería incluir un argumento adicional que usted sabe que nunca existiría y luego filtrar la salida de error relacionada con ese archivo inexistente. Tomaré nota para que conste que analizar el resultado de ls
es una mala idea, pero les daré esto en caso de que ayude:
$ function dls() {
if [[ $# -eq 0 ]]; then
ls
else
ls ${@} this-file-does-not-exist-anywhere 2> >(grep -v this-file-does-not-exist-anywhere)
fi
}
$ dls
foo
$ dls f*
foo:
1 2
Hacer algo como esto podría tener consecuencias no deseadas (por ejemplo, es posible que no pueda redirigir los mensajes de error estándar como lo haría normalmente).
Respuesta3
Utilice el -al
parámetro que la mayoría de las personas utilizan siempre. ls
No lo haré entonces, hasta que agregue una barra diagonal al nombre del directorio. El otro parámetro es -d
, entonces no descenderá de ninguna manera.
Si lo desea permanente, coloque lo siguiente en .bashrc
su directorio de inicio:
alias lsd='ls -d' ;
Puede utilizar el comando lsd
en el futuro.