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“, ls
wenn ls -l
mein Datei- oder Verzeichnisname beispielsweise länger als 20 Zeichen ist?
Gibt es eine Möglichkeit, in meinem eine Bash-Funktion einzurichten, .bashrc
um 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, ls
die 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 ls
zu more
oder weiter less
, was ebenfalls zur einspaltigen Anzeige führt.) Oder verwenden Sie find
mit -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.