Wenn die Zeilen einer Datei oder eines Verzeichnisses zu lang werden, auf das LS-Listenformat aktualisieren?

Wenn die Zeilen einer Datei oder eines Verzeichnisses zu lang werden, auf das LS-Listenformat aktualisieren?

Gibt es eine Möglichkeit, dies zu tun? Wenn beispielsweise ein Name wie dieser lange ist:

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/

Kann ich von auf „upgraden“, lswenn ls -lmein Datei- oder Verzeichnisname beispielsweise länger als 20 Zeichen ist?

Gibt es eine Möglichkeit, in meinem eine Bash-Funktion einzurichten, .bashrcum dies zu tun? Ich werde die resultierende Funktion lls() nennen.

@tripleee fragte:

Möchten Sie ls -l, dass der Eingabedateiname lang ist? Warum? Dadurch wird die Ausgabe länger und nicht kürzer. Was ist, wenn Sie eine Mischung aus langen und kurzen Dateinamen erhalten?

Ich möchte eher, dass die langen Dateinamen in einer Liste systematisiert werden (und dass es für mich leichter ist, sie zu verarbeiten und zu lesen, wenn ich eine feste Spalte durchgehe); bei einer Mischung aus langen und kurzen Dateinamen würde ich standardmäßig das Listenformat verwenden.

Antwort1

Es gibt keine integrierte Option, lsdie das tut, was Sie wollen. Sie müssten die Ausgabe analysieren und dann neu starten, wenn „lange“ Dateinamen gefunden werden, oder etwas wie Folgendes tun:

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

(Geben Sie so viele ein ?, wie Ihr Längenlimit beträgt. Sie können das als Alias ​​einrichten.)

Warum verwenden Sie nicht einfach ls -1? (Das ist eine Eins, kein kleines L.) Es listet Dateien immer in einer einzigen Spalte auf. (Oder leiten Sie lszu moreoder weiter less, was ebenfalls zur einspaltigen Anzeige führt.) Oder verwenden Sie findmit -maxdepth 1.

Antwort2

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

oder, dank des Manatwork-Vorschlags, dieser viel einfachere Weg, der voraussetzt, dass GNU wc verfügbar ist:

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

Antwort3

Dies ist mein unabhängiger Versuch, das zu erreichen, was ich wollte:

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
}

Ich habe dies in meine .bashrc eingefügt. Dies erfordert jedoch die Verwendung von tr, cut und wc.

verwandte Informationen