Jawaban paling sederhana adalah membaginya menjadi dua perintah: ini paling baik dilakukan dalam skrip (seperti lssort
), tetapi jika Anda ingin ls
selalu bekerja dengan cara ini Anda bisa alias ls=lssort
: -
ls -d --group-directories-first "$@"/.*
ls -d --group-directories-first "$@"/*
Ini mengasumsikan bahwa nama direktori tunggal (yang mungkin mengandung spasi) diberikan dan itu adalah parameter terakhir yang dilewati. Sayangnya ini memiliki dua batasan: -
- Direktori harus diberikan: untuk mengatasinya Anda perlu memindai parameter untuk menemukan yang terakhir dan membuat panggilan yang berbeda jika parameter terakhir adalah opsi atau tidak ada (ganti
/
dengan ruang dalam panggilan di atas).
- Jika
ls
opsi menyebabkan garis total (misalnya -l
) menjadi output, Anda akan mendapatkan dua total, satu untuk setiap panggilan.
Yang pertama dijawab dengan skrip: -
[ $# == 0 ] && lp='' || eval lp="\${$#}"
[ "${lp#-}" == "$lp" ] && sl=/ || sl=' '
ls -d --group-directories-first "$@"$sl.*
ls -d --group-directories-first "$@"$sl*
Yang kedua mengharuskan semua file untuk dicantumkan dalam satu perintah dan output diarahkan ke file sementara dengan grep
pencarian berturut-turut , pertama untuk ^total [0-9]*$
, kemudian untuk file yang dimulai dengan .
, kemudian pencarian yang sama dengan -v
daftar sisanya. Dengan demikian mudah jika ls
menghasilkan nama file telanjang, tetapi jauh lebih kompleks dalam kasus umum, di luar cakupan jawaban ini.
Catatan: -
ls -d
diperlukan untuk menghindari perluasan subdirektori.
... && ... || ...
adalah bentuk yang lebih kompak if ...; then ...; else ...; fi
.
eval
diperlukan untuk membuat bash
parse baris perintah dua kali: ${$#}
memberikan kesalahan.