Saya ingin menggunakan ls
perintah untuk pertama menampilkan direktori dan kemudian file. Saya mencoba:
ls -la | sort -k 1
Tapi saya mendapat urutan yang salah.
ls -lh --group-directories-first
Saya ingin menggunakan ls
perintah untuk pertama menampilkan direktori dan kemudian file. Saya mencoba:
ls -la | sort -k 1
Tapi saya mendapat urutan yang salah.
ls -lh --group-directories-first
Jawaban:
Perintah berikut akan daftar direktori pertama, file biasa kedua, dan tautan ketiga.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
Juga, akan sangat masuk akal untuk membuat alias untuk perintah ini untuk menyimpan penekanan tombol.
Sunting:
Jika Anda ingin direktori terlebih dahulu, dan kemudian semua yang bukan direktori kedua, gunakan ini:
ls -la | grep "^d" && ls -la | grep -v "^d"
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"
?
alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
ls -la|grep ^d;ls -la|grep -v ^d
(tanda kutip tidak diperlukan dan diganti &&
dengan ;
). Pilihan lain adalah untuk memperkenalkan variabel dan kemudian mengevaluasinya: a="ls -la|grep ^d";eval $a;eval $a -v
. Dapat bermanfaat untuk menghindari pengulangan ketika lebih banyak opsi ditentukan untuk ls
/ grep
. Ada juga ls -la --group-directories-first
pilihan itu, namun imo tersingkat adalahls -la|sort
Saya sangat menyukai * nix dan suka melihat daya cipta yang masuk ke beberapa balasan ini ...
Milik saya hampir tidak seperti di GNU Linux:
alias ls='ls --color -h --group-directories-first'
Mengingat bahwa saya lebih nyaman dengan aplikasi linux CLI saya, saya juga cenderung memperbarui coreutils di OSX:
brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
brew install bash
Kemudian, ini akan berhasil! :)
Untuk pengguna Mac coreutils :
brew install coreutils
alias ls='ls --color -h --group-directories-first'
Dengan asumsi sistem Anda siap untuk homebrew :
gls
agak. Baik?
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
.
Ada hal-hal tertentu yang ingin saya lihat dalam daftar direktori, dan sejauh ini tidak ada jawaban di sini yang memenuhi semua persyaratan di bawah ini. Persyaratan saya untuk daftar direktori:
./
dan ../
), file, dan tautan--group-directories-first
tidak bekerja di Git Bash untuk WindowsSetelah banyak peretasan, saya akhirnya menemukan satu-liner (meskipun garis yang sangat panjang ;-)) yang saya puas. Saya telah menugaskan ini ke alias bernama 'dir':
ls -dlF --color * .* | head -n2 && ls -AlF | LC_ALL=C grep "^d" |
LC_ALL=C sort -k 9df && ls -AlF | LC_ALL=C grep "^[l-]" |
LC_ALL=C sort -k 9df && echo -e `find -maxdepth 1 -type d ! -name . |
wc -l` Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f |
wc -l` File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- |
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l` Link\(s\)
Agar lebih mudah dikelola, saya datang dengan perintah terpisah untuk menampilkan setiap segmen dari daftar direktori sesuai dengan keinginan saya, lalu menggabungkannya menggunakan &&
operator.
ls -dlF --color * .* | head -n2
- Ekstrak ./
dan ../
. Kami tidak ingin melewati ini sort
karena sudah dalam urutan yang benar, dan mengurutkannya dapat ../
didaftarkan terlebih dahulu. The -d
pilihan adalah untuk menyingkirkan "total" line; Saya ingin menambahkan -F
untuk memperlihatkan trailing slash untuk direktori (ini juga akan menandai symlink dengan "@" ketika Anda melakukan hal biasa ls -F
).
ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df
- Ekstrak direktori dan urutkan berdasarkan nama file (kolom ke-9), abaikan karakter non-alpha / spasi ( d
opsi) dan huruf besar-kecil ( f
opsi). The ls -A
tidak termasuk opsi ./
dan ../
dari daftar karena kita sudah diekstrak dalam langkah sebelumnya. Saya cenderung untuk awalan semua grep
dan sort
perintah dengan LC_ALL=C
reset lokal sehingga (1) output konsisten di seluruh shell Unix, dan (2) Anda kadang-kadang dapat melihat kinerja lebih cepat karena tidak lagi memiliki overhead karakter UTF-8 yang diatur ke berurusan dengan.
ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df
- Ini mirip dengan langkah di atas, tapi kali ini kami menyortir file dan symlink.
find -maxdepth 1 -type d ! -name . | wc -l
- Dapatkan jumlah direktori, tidak termasuk ./
dan ../
.
find -maxdepth 1 -type f | wc -l
- Dapatkan jumlah file.
find -maxdepth 1 -type l | wc -l
- Dapatkan jumlah symlink.
du -hs | cut -f 1
- Ekstrak ukuran total semua subdirektori dalam format yang dapat dibaca manusia.
find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1
- Ekstrak ukuran total semua file dalam format yang dapat dibaca manusia.
Mari kita lihat dir
alias baru kita dalam aksi!
SEBELUM:
$ ls -alF
total 22
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
SETELAH:
$ dir
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
5 Dir(s) 2.8M 6 File(s) 31K 0 Link(s)
Satu kelemahan kecil adalah Anda tidak dapat memiliki daftar warna, karena karakter kontrol warna yang mengelilingi nama file membuat penyortiran terlalu tidak dapat diandalkan.
MEMPERBARUI
Alias di atas sangat lambat ketika dijalankan dari direktori root dari sistem file yang dalam, jadi saya telah memperbarui ke perintah yang lebih sederhana tetapi jauh lebih performant ini:
ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'
Output sampel:
$ dir
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom 0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom 0 Jun 16 2016 temp/
drwxr-xr-x 1 Tom 0 Jul 13 2016 vimfiles/
-rw-r--r-- 2 Tom 365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom 2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom 2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom 1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom 8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom 2444 Jul 13 2016 _vimrc
33819 bytes
Karena versi baru dari Git Bash untuk Windows mendukung --group-directories-first
, kami tidak lagi harus kembali aktif sort
. Meskipun alias baru tidak menampilkan informasi sebanyak alias sebelumnya, keuntungan kinerja lebih dari sepadan. Sebagai kegembiraan, Anda juga mendapatkan warna!
Anda punya beberapa pilihan, tergantung jika Anda ingin menjaga urutan abjad.
Anda bisa mencoba:
ls -al | sort -k1 -r
atau ini, untuk menjaga urutan alfabet untuk file dengan izin yang sama:
ls -al | sort -k1,1 -k9,9 -r
atau, seperti yang dikatakan sebelas81 (tetapi versi ini mencantumkan semuanya):
ls -la | grep "^ d" && ls -la | grep "^ -" && ls -al | grep -v "^ [d | -]"
ls- al|sort -k1 -r
bekerja. Yang hilang hanyalah -r
bendera.
./
dan ../
tidak akan menjadi dua baris pertama, dalam urutan itu. Selain itu, saya setuju bahwa ini adalah solusi yang lebih efisien.
Untuk jawaban delerious010 , saya akan menambahkan bahwa jika Anda ingin memesan gaya lama:
LANG=C ls -la --group-directories-first
(atau gunakan LC_ALL atau LANGUAGE atau LC_COLLATE setel ke "C").
Ini akan memberikan sesuatu yang mirip dengan:
.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file
Meskipun, jika saya ingat dengan benar, file dot tersembunyi awalnya muncul di depan direktori.
Inilah fungsi untuk melakukan ini (bash atau zsh): Dan ... Saya tidak menyarankan ini adalah cara terbaik, tapi inilah yang saya buat dan saya gunakan saat ini:
berfungsi lss { # Menampilkan daftar direktori dengan direktori di bagian atas. perintah ls --color = selalu $ @ | egrep '^ d | total' perintah ls --color = selalu $ @ | egrep -v '^ d | total'; }
ls -l
) untuk memfilter menurut jenis file seperti itu. Juga, perintah ini akan memecah spasi (dalam bash). Anda perlu mengutip seperti ini: "$@"
Jika Anda ingin menggunakan pendekatan ini, Anda dapat melakukan sesuatu seperti:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
ls -laX
akan menampilkan direktori pertama dalam urutan abjad, tetapi akan mengacaukan daftar file.
Opsi panjang:
ls
-l # List
--all
-X # Sort alphabetically by entry extension
Cara lain ...
find . -d 1 -type d | ls -la | sort -r
ATAU
ls -la | sort -r
ATAU
d=`find . -type d -d 1`;f=`find . -type f -d 1`; echo -e -DIRS- "\n$d\n" -FILES- "\n$f"
alias ls='ls -lhF --color'
list_sorted() {
ls $* | grep "^d";
ls $* | grep "^-";
ls $* | grep -v -E "^d|^-|^total"
}
alias ll=list_sorted
Saya menggunakan kombinasi solusi yang disediakan dalam jawaban dan komentar di sini.
ls
Pertama-tama, saya menimpa perilaku default untuk ls
:
-l
: Selalu tampilkan daftar sebagai daftar vertikal satu dimensi-h
: Tampilkan ukuran file dengan cara yang dapat dibaca manusia (mis. 4.0K bukannya 4096)-F
: Menampilkan indikator seperti garis miring untuk direktorialias ls='ls -lhF --color'
ll
Selanjutnya, saya menulis fungsi yang berisi logika pengurutan. Untuk setiap ls
saya melewati setiap argumen yang semula disahkan untuk itu. Itu memungkinkan saya menggunakan alias dari direktori kerja yang berbeda dari yang ingin saya daftarkan (yaitu ls -a ~
).
Juga, setiap panggilan ke ls
disalurkan ke grep
perintah. Di sini, penyortiran terjadi. ls -l | grep "^d"
misalnya hanya mendaftar direktori. Jika direktori harus didaftar terlebih dahulu, ini harus didahulukan dalam fungsi juga. Selanjutnya adalah file.
Terakhir, saya menunjukkan semua yang bukan direktori atau file (atau baris yang menunjukkan ukuran total isi direktori). Ini dilakukan dengan menangkap directoy, entri file biasa dan total entri dan kemudian membalikkan hasilnya melalui -v
argumen.
list_sorted() {
# List directories
ls $* | grep "^d";
# List regular files
ls $* | grep "^-";
# List everything else (e.g. symbolic links)
ls $* | grep -v -E "^d|^-|^total"
}
Akhirnya, saya alias fungsi ke perintah baru. Khususnya saya tidak ingin menimpa ls
kalau-kalau fungsi saya melanggar beberapa skenario. Maka saya ingin dapat menggunakan ls
. Atau, Anda selalu dapat menjalankan perintah yang tidak disebutkan ls
dengan memohon \ls
.
alias ll=list_sorted
;
bukannya &&
sebagai pembatas untuk perintah. Jika tidak, seseorang tidak dapat membuat daftar isi direktori yang tidak mengandung direktori (perintah ls pertama bernilai false, sehingga tidak memungkinkan eksekusi perintah berikutnya karena ditambah dengan &&
. ;
Hindari itu.)Ini adalah solusi skrip. Daftar hanya nama, tidak ada data inode, abjad, tidak peka huruf besar kecil, diformat ke dalam kolom. Meskipun itu baris-utama, bukan kolom utama seperti output default ls. Kolom menjadi sedikit berantakan jika ada nama file dengan> 26 karakter.
rm -f /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
Dan yang lainnya, dengan beberapa format tambahan.
rm -f /tmp/lsout
echo " ---- Directories ---- " >> /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
rm -f /tmp/lsout
echo " ------- Files ------- " >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
Output untuk yang terakhir terlihat seperti berikut, minus warna:
---- Directories ---- archive/ bookmarks/
Desktop/ Documents/ Downloads/
fff/ health/ Library/
Movies/ Music/ Pictures/
Public/ rrf/ scifi/
testdir/ testdir2/
------- Files ------- @todo comedy
delme lll maxims
schedule vtokens style
Hanya ingat untuk tidak alias atau mengubah perilaku default ls karena skrip ini menyebutnya.
-
datang sebelumnyad
ketika menggunakansort