Чтобы команда ls вела себя по-разному в зависимости от количества записей

Возможно, в вашей установке Ubuntu отсутствуют некоторые пакеты OpenGL / GLX для использования GLX. Вы можете попробовать установить mesa-utils (OpenGL в зависимостях) и запустить glxgears и glxinfo, чтобы проверить это.

2
25.03.2016, 16:07
5 ответов

Создайте свой собственный сценарий, например в Python, который подсчитывает аргументы и вызывает ls (1) с правильными аргументами и украшает его more (1) для разбивки на страницы по мере необходимости (если вывод идет на tty) .

0
27.01.2020, 21:59

Вы можете поместить каждый листинг в отдельную строку, а затем использовать wordcount для подсчета строк и иметь оператор if else fi в зависимости от количества файлов.

files=$(ls "$@" | wc -l)
if [ $files -ge 50 ]
then
something
fi

извините, если это не то, что вы ищете.

0
27.01.2020, 21:59

Вот моя интерпретация вопроса. Он специфичен для bash, поскольку использует массив. Он определяет функцию с именем ls (поэтому обязательно запустите unalias ls , чтобы освободить путь для ее выполнения как просто ls ). Функция создает массив заданных аргументов (или текущего содержимого каталога, если аргументы не заданы); затем он подсчитывает эти элементы, чтобы определить, какие флаги ls использовать (меньше 10, используйте ls -ld ; в противном случае используйте ls -d ); если файлов более 50, отображаются только первые 50 и отображается сообщение. Я также нагло скопировал идею Кевина / jlliagre о том, чтобы функция ls вела себя более нормально, когда вывод не на экран.

Это не позволяет передавать флаги в реальный ls ; такие вещи, как -r и -a , потребуют особого внимания.

function ls {
  _ls_longlimit=10
  _ls_cutoff=50
  declare -a _ls_files

  [ ! -t 1 ] && { command ls "$@"; return; }
  # TODO: skip past any "-rtxyz" options
  if [ $# -eq 0 ]
  then
    _ls_files=(*)
  else
    for a in "$@"
    do
      if [ -d "$a" ]
      then
        # add "${a}/*" to array
        _ls_files+=("${a}"/*)
      else
        # add $a to array
        _ls_files+=("$a")
      fi
    done
  fi
  if [ ${#_ls_files[@]} -le $_ls_longlimit ]
  then
    command ls -ld "${_ls_files[@]}"
  else
    # -1 because arrays are 0-based
    command ls -d "${_ls_files[@]:0:_ls_cutoff - 1}"
  fi
  if [ ${#_ls_files[@]} -gt $_ls_cutoff ]
  then
    echo $((${#_ls_files[@]} - _ls_cutoff)) more entries
  fi
}
0
27.01.2020, 21:59

Если вам не нужна пользовательская команда сценария/оберточная функция, то вам нужна пользовательская двоичная команда. Доступны исходные тексты GNU ls, а также другие реализации.

Создайте свою собственную исправленную версию ls и вы будете готовы.

Обратите внимание, что это изменение в поведении нарушит соответствие POSIX.

Редактирование (в соответствии с вашим измененным вопросом):

ls() {
    if [ $(command ls "$@" | wc -l) -gt 10 ]; then
        command ls "$@" | head -50
    else
        command ls -l "$@"
    fi
}

Улучшенная версия, показывающая количество оставшихся записей:

ls() {
    [ ! -t 1 ] && { command ls "$@" ; return ; }
    r=$(command ls "$@")
    lines=$(printf "%s" "$r" | wc -l)
    if [ $lines -gt 10 ]; then
        printf "%s" "$r" | head -50
        if [ $lines -gt 50 ]; then
          printf "%d more entries\n" $((lines - 50))
        fi
    else
        command ls -l "$@"
    fi
}
4
27.01.2020, 21:59

Я не могу переопределить сам ls, но вы можете использовать эту функцию для ls2 ':

ls2 () {
  num_of_files=`ls | grep "\/$" | wc -l`
  if [ "$num_of_files" -gt "10" ]; then
    ls | less
  else
    ls -l
  fi  
}

для создания специальной команды ls2, которая использует grep для поиска каталогов, а затем wc (функция подсчета слов unix с опцией количества строк), чтобы подсчитать их количество. Вы можете изменить количество файлов в сравнении «10». Вы можете изменить то, что на самом деле делается, изменив команды ls -l и / или ls -a

Если вы не знакомы с функциями bash - поместите код в файл , затем chmod + x файл, чтобы сделать его исполняемым, затем запустите файл с . the_filename , а затем используйте функцию с ls2

. Для постоянного решения добавьте функцию в свой файл .bashrc (и рассмотрите возможность создания файла, полученного из .bashrc , чтобы вы могли начать добавлять больше функций в одном месте и не делать ваш файл .bashrc неудобным.

Я не могу получить меньше, чтобы отображать записи за раз.

{{ 1}}
0
27.01.2020, 21:59

Теги

Похожие вопросы