項目数によって ls コマンドが異なる動作をする

項目数によって ls コマンドが異なる動作をする

リストできるディレクトリエントリの数によって、lsコマンドが異なる動作をすることができますか?

使用する場合ls(修正オプションはありませんが、ディレクトリまたはフィルタを指定できます)、次のことを望みます。

  • -l項目数が10個以下の場合は、長いリスト形式を使用してください。
  • 最初の50項目のみを表示し、警告を出力します。x more entries

可能ですか?どうすればいいですか?

カスタムスクリプトを使用してカスタムコマンドに切り替えたくありません。カスタムスクリプトやラッパーを使用できますが、それでもlsこれを行い、機能全体を維持するために使用したいと思います。つまり、単にスクリプト/ラッパーをmy-custom-ls呼び出すだけではありません。ls

答え1

カスタムスクリプトコマンド/ラッパー関数が必要ない場合は、カスタムバイナリコマンドが必要です。 GNUlsソースコードは他の実装と同様に利用可能です。

独自のパッチバージョンを作成するだけ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
}

答え2

ls(1)引数を計算し、正しい引数で呼び出す独自のスクリプト(Pythonなど)を作成し、必要に応じてmore(1)ページを付けます(出力がttyに移動した場合)。

答え3

ls自体をオーバーライドすることはできませんが、 "ls2"でこの関数を使用できます。

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

grepを使用してディレクトリを見つけ、次にwc(行オプションを持つunix単語数関数)を使用してディレクトリ数を計算するカスタムコマンドls2を作成します。 「10」比較でファイル数を変更できます。ls -lおよび/またはコマンドを変更して、ls -a実際に実行される操作を変更できます。

Bash関数を初めて使用する場合 - コードをファイルに入れてからファイルをchmod +x実行可能にし、ファイルを実行して. the_filename関数を使用します。ls2

永続的な解決策を見つけるには、ファイルに機能を追加したり、ファイルを扱うのを難しくすることなく、1つの場所でより多くの機能を追加できるように、ファイルから派生したファイルを.bashrc作成することを検討してください。.bashrc.bashrc

アイテムを複数回表示することはできません。

答え4

これが問題の私の説明です。配列を使用しているため、bash専用です。これは呼び出される関数を定義します(したがって実行方法をクリアするにはls実行する必要があります)。この関数は、与えられた引数の配列(または引数が指定されていない場合は現在のディレクトリの内容の配列)を生成します。次に、使用するフラグを決定するためにこれらの要素を計算します(10未満の場合はを使用し、それ以外の場合)。ファイルが50個を超えると、最初の50個のみが表示され、メッセージが表示されます。また、出力が画面に出力されないときに機能がより正常に機能するように、Kevin / jlliagreのアイデアを明確にコピーしました。unalias lslslsls -ldls -dls

これはフラグがrealに渡されることを許可せず、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
}

関連情報