Cuando las líneas de un archivo o directorio se vuelven demasiado largas, ¿actualizar al formato de lista ls?

Cuando las líneas de un archivo o directorio se vuelven demasiado largas, ¿actualizar al formato de lista ls?

¿Hay alguna manera de hacer esto? Por ejemplo, si obtiene un nombre largo como:

i-have-names-that-are-too-long-to-describe/
i-have-names-that-are-too-long-to-describe-2/
i-have-names-that-are-too-long-to-descri-3/

¿Puedo "actualizar" de lsa ls -ldado que tengo un nombre de archivo o directorio que tiene más de, digamos, 20 caracteres?

¿Hay alguna manera de configurar una función bash en mi .bashrcpara hacer esto? Llamaré a la función resultante lls().

@tripleee preguntó:

¿Quiere ls -lque el nombre del archivo de entrada sea largo? ¿Por qué? Hará que la salida sea más larga, no más corta. ¿Qué pasa si recibe una combinación de nombres de archivos largos y cortos?

Lo quiero más para que la lectura de los nombres de archivos largos se sistematice en una lista (y sea más fácil para mí digerir y leer en una columna fija); para una combinación de nombres de archivos largos y cortos, usaría de forma predeterminada el formato de lista.

Respuesta1

No hay ninguna opción incorporada lsque haga lo que usted quiere. Tendría que analizar el resultado y luego reiniciar si se encuentran nombres de archivos "largos", o hacer algo como:

$ ls ??????????* >& /dev/null && ls -l || ls

(Pon tantos ?como tu límite de longitud. Puedes configurarlo como un alias).

¿Por qué no lo usas simplemente ls -1? (Ese es un uno, no una L minúscula). Siempre enumera los archivos en una sola columna. (O canalizar lsa moreo less, que también va a la visualización de una sola columna). O utilizar findcon -maxdepth 1.

Respuesta2

if [ $(ls "$@" | ( max=0; while read l ; do len=${#l} ; [[ $max -lt $len ]] && max=$len; done; echo $max )) -gt 20 ]
then
    ls "$@"
else
    ls -l "$@"
fi

o, gracias a la sugerencia de manatwork, esta forma mucho más sencilla que supone que GNU wc está disponible:

[[ $(ls "$@" | wc -L) -gt 20 ]] && ls "$@" || ls -l "$@"

Respuesta3

Este es mi intento independiente de lo que quería:

lls(){
  opt="   "      
  for i in $(ls -l | tr -s " " | cut -d' ' -f9)  
  do   
    count=$(echo $i | wc -m)  
     if [ $count -gt 20 ] ; then    
       opt=" -l"; break;           
     fi    
  done  
  ls $opt
}

Coloqué esto en mi .bashrc. Sin embargo, esto requiere el uso de tr, cut y wc.

información relacionada