
リストできるディレクトリエントリの数によって、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 ls
ls
ls
ls -ld
ls -d
ls
これはフラグが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
}