ls: muestra el nombre del directorio cuando solo uno coincide con el patrón

ls: muestra el nombre del directorio cuando solo uno coincide con el patrón

Cuando se usa lspara 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 lspara 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:
    1. solo hay un argumento
    2. 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 printfimplementaciones, puede reemplazar %scon %qpara que el nombre del directorio se componga de manera similar a como lslo 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 lstiene 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 lslo 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 lses 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 -alparámetro que la mayoría de las personas utilizan siempre. lsNo 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 .bashrcsu directorio de inicio:

alias lsd='ls -d' ;

Puede utilizar el comando lsden el futuro.

información relacionada