Если строки файла или каталога становятся слишком длинными, перейти на формат списка ls?

Если строки файла или каталога становятся слишком длинными, перейти на формат списка ls?

Есть ли способ сделать это? Например, если a получает длинное имя, например:

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/

Могу ли я «обновиться» с lsдо ls -l, если у меня есть имя файла или каталога, которое длиннее, скажем, 20 символов?

Есть ли способ настроить функцию bash в my, .bashrcчтобы сделать это? Я назову полученную функцию lls().

@tripleee спросил:

Вы хотите, ls -lкогда имя входного файла длинное? Почему? Это сделает вывод длиннее, а не короче. Что делать, если вы получаете смесь длинных и коротких имен файлов?

Я больше хочу, чтобы длинные имена файлов были систематизированы в список (и мне было бы легче их воспринимать и читать, перемещаясь по фиксированному столбцу); для смеси длинных и коротких имен файлов я бы по умолчанию использовал формат списка.

решение1

Нет встроенной опции, lsкоторая делает то, что вам нужно. Вам придется анализировать вывод, а затем перезапускать, если будут найдены «длинные» имена файлов, или делать что-то вроде:

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

(Введите столько, ?сколько позволяет ваша длина. Вы можете установить это как псевдоним.)

Почему бы вам просто не использовать ls -1? (Это единица, а не строчная буква L.) Он всегда выводит список файлов в одном столбце. (Или передайте lsпо конвейеру moreили less, что также приводит к отображению в один столбец.) Или используйте findс -maxdepth 1.

решение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

или, благодаря предложению manatwork, этот гораздо более простой способ, предполагающий доступность GNU wc:

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

решение3

Это моя независимая попытка сделать то, что я хотел:

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
}

Я поместил это в свой .bashrc. Хотя это требует использования tr, cut и wc.

Связанный контент