Quando as linhas de um arquivo ou diretório ficam muito longas, atualize para o formato de lista ls?

Quando as linhas de um arquivo ou diretório ficam muito longas, atualize para o formato de lista ls?

Existe uma maneira de fazer isso? Por exemplo, se a receber um nome longo 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/

Posso "atualizar" de lspara ls -l, já que tenho o nome de um arquivo ou diretório com mais de 20 caracteres?

Existe uma maneira de configurar uma função bash para .bashrcfazer isso? Chamarei a função resultante de lls().

@tripleee perguntou:

Você quer ls -lquando o nome do arquivo de entrada for longo? Por que? Isso tornará a saída mais longa, não mais curta. E se você receber uma mistura de nomes de arquivos longos e curtos?

Eu quero mais para que a leitura dos nomes de arquivos longos seja sistematizada em uma lista (e mais fácil para mim digerir e ler descendo em uma coluna fixa); para uma mistura de nomes de arquivos longos e curtos, eu usaria o formato de lista como padrão.

Responder1

Não há nenhuma opção integrada lsque faça o que você deseja. Você teria que analisar a saída e reiniciar se nomes de arquivos "longos" forem encontrados ou fazer algo como:

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

(Coloque quantos ?forem o seu limite de comprimento. Você pode configurá-lo como um alias.)

Por que você simplesmente não usa ls -1? (Esse é um, não um L minúsculo.) Ele sempre lista os arquivos em uma única coluna. (Ou canalize lspara moreou less, que também vai para a exibição de coluna única.) Ou use findwith -maxdepth 1.

Responder2

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

ou, graças à sugestão do manatwork, esta maneira muito mais simples que assume que o GNU wc está disponível:

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

Responder3

Esta é minha tentativa independente do que eu queria:

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
}

Coloquei isso no meu .bashrc. Isso requer o uso de tr, cut e wc.

informação relacionada