Jawaban paling sederhana adalah membaginya menjadi dua perintah: ini paling baik dilakukan dalam skrip (seperti lssort), tetapi jika Anda ingin lsselalu 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
lsopsi 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 greppencarian berturut-turut , pertama untuk ^total [0-9]*$, kemudian untuk file yang dimulai dengan ., kemudian pencarian yang sama dengan -vdaftar sisanya. Dengan demikian mudah jika lsmenghasilkan 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.
evaldiperlukan untuk membuat bashparse baris perintah dua kali: ${$#}memberikan kesalahan.