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

3

Existe uma maneira de fazer isso? Por exemplo, se um nome longo for 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 ls para ls -l , pois tenho um nome de arquivo ou diretório maior que 20 caracteres?

Existe uma maneira de configurar uma função bash no meu .bashrc para fazer isso? Vou chamar a função resultante lls ().

@tripleee perguntou:

Do you want ls -l when the input file name is long? Why? It will make the output longer, not shorter. What if you receive a mix of long and short filenames?

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 indo para uma coluna fixa); para uma mistura de nomes de arquivos longos e curtos, eu usaria como padrão o formato da lista.

    
por Kevin Lee 15.07.2012 / 07:39

3 respostas

3

Não há uma opção incorporada em ls que faça o que você deseja. Você teria que analisar a saída e, em seguida, reiniciar se os nomes de arquivos "longos" forem encontrados ou fizer algo como:

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

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

Por que você simplesmente não usa ls -1 ? (Isso é um, não um L. minúsculo) Sempre lista os arquivos em uma única coluna. (Ou canalize ls para more ou less , que também vai para exibição de coluna única.) Ou use find com -maxdepth 1 .

    
por 15.07.2012 / 08:49
2
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 o GNU wc está disponível:

[[ $(ls "$@" | wc -L) -gt 20 ]] && ls "$@" || ls -l "$@"
    
por 15.07.2012 / 08:49
0

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 embora.

    
por 17.07.2012 / 06:06