Bagaimana saya bisa memodifikasi perintah `ls` saya?

12

Ketika saya mengetik ls, saya mendapatkan daftar normal, atau ketika saya mengetik ls -lasaya mendapatkan versi detail dengan semuanya ...

Tapi saya benci tata letaknya ls, hanya saja tidak intuitif untuk sebagian besar penggunaan saya.

Apakah ada beberapa cara saya dapat memodifikasi (tanpa mengubah kode sorot ls, skrip bash tidak apa-apa), lsjadi tampilannya bukan

-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename0
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename1
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename2
drwx------ 13 user group 123546 2011-01-01 11:11 directory0
-rwxr-xr-x 13 user group 123546 2011-01-01 11:11 filename3
drwx------ 13 user group 123546 2011-01-01 11:11 directory1

Saya bisa mendapatkan daftar lebih seperti:

DIRS
directory0 1293880260 700 user:group
directory1 1293880260 700 user:group

FILES
filename0 1293880260 751 user:group
filename1 1293880260 755 user:group
filename2 1293880260 777 user:group
filename3 1293880260 705 user:group

Atau variasi lainnya.

Sementara itu, menjaga kemampuan untuk menggunakan bendera dan opsi lainnya.

Penyamaran
sumber

Jawaban:

15

Anda dapat menulis skrip bash yang disebut ~/bin/lsyang harus ditimpa /bin/ls. ingat untuk berlari chmod +x ~/bin/ls.

Saya baru saja menulis ini yang tampaknya melakukan sebagian besar dari apa yang ingin Anda capai (termasuk menyampaikan argumen tambahan)

#!/bin/bash

DIRS="`/bin/ls --color=auto -l $@ | grep ^d`"
FILES="`/bin/ls --color=auto -l $@ | grep ^\-`"

if [ "$DIRS" ]
then
    echo "DIRECTORIES"
    echo -e "$DIRS\

"
fi

if [ "$FILES" ]
then
    echo "FILES"
    echo "$FILES\

"
fi

Seseorang mungkin ingin merapikannya sedikit atau meningkatkan format output, tapi begitulah. Milikmu untuk melakukan apapun yang kamu suka.

Dan inilah beberapa contoh asli:

ls
DIRECTORIES
drwxr-xr-x 4 oli oli     4096 2010-12-16 15:40 markitup
drwxr-xr-x 7 oli oli     4096 2011-01-16 16:58 media
drwxr-xr-x 3 oli oli     4096 2010-12-16 15:41 post
drwxr-xr-x 9 oli oli     4096 2010-09-16 05:23 templates

FILES
-rw-r--r-- 1 oli oli  5361664 2010-09-06 16:32 db.db
-rw-r--r-- 1 oli oli        0 2008-12-11 09:22 __init__.py
-rwxr-xr-x 1 oli oli      542 2008-12-11 09:22 manage.py
-rw-r--r-- 1 oli oli       13 2010-03-23 18:14 settingsdev.py
-rw-r--r-- 1 oli oli     2642 2010-12-16 15:40 settings.py
-rw-r--r-- 1 oli oli     1818 2010-12-16 15:40 urls.py
-rw-r--r-- 1 oli oli      432 2010-06-22 20:54 views.py

Dan dengan argumen:

ls -a
DIRECTORIES
drwxr-xr-x  8 oli oli     4096 2011-01-12 00:46 .
drwxr-xr-x 19 oli oli     4096 2011-04-13 17:24 ..
drwxr-xr-x  6 oli oli     4096 2010-02-03 13:50 .bzr
drwxr-xr-x  4 oli oli     4096 2010-12-16 15:40 markitup
drwxr-xr-x  7 oli oli     4096 2011-01-16 16:58 media
drwxr-xr-x  3 oli oli     4096 2010-12-16 15:41 post
drwxr-xr-x  9 oli oli     4096 2010-09-16 05:23 templates

FILES
-rw-r--r--  1 oli oli       65 2010-03-27 07:58 .bzrignore
-rw-r--r--  1 oli oli  5361664 2010-09-06 16:32 db.db
-rw-r--r--  1 oli oli        0 2008-12-11 09:22 __init__.py
-rwxr-xr-x  1 oli oli      542 2008-12-11 09:22 manage.py
-rw-r--r--  1 oli oli       13 2010-03-23 18:14 settingsdev.py
-rw-r--r--  1 oli oli     2642 2010-12-16 15:40 settings.py
-rw-r--r--  1 oli oli     1818 2010-12-16 15:40 urls.py
-rw-r--r--  1 oli oli      432 2010-06-22 20:54 views.py
Oli
sumber
7

Ini pukulan cepat saya.

$ function lss { ls -l --group-directories-first --time-style +%s $@ | grep -v '^total' | awk 'BEGIN {print("DIRS")} {if (f!=1 && $1 ~ /^-/) {print "\nFILES"; f=1}; printf("%s\t%s %s %s:%s\n", $7, $6, $1, $3, $4);}'; }
$ alias ls='lss'
$ ls
DIRS
directory0  1305901476 drwxr-xr-x ak:ak
directory1  1305901476 drwxr-xr-x ak:ak

FILES
filename0   1305901484 -rw-r--r-- ak:ak
filename1   1305901484 -rw-r--r-- ak:ak
filename2   1305901484 -rw-r--r-- ak:ak
filename3   1305901484 -rw-r--r-- ak:ak

Manfaat dari pendekatan ini adalah tidak memerlukan banyak direktori traversal dan mencetak hasilnya setelah siap. Coba jalankan ini setelah touch filename{0..10000}sebagai tes.

Jatuhkan functiondan aliasgaris ke dalam ~/.bashrcuntuk membuatnya permanen.

Benchmarking dari Oli:

oli@bert:~/Desktop$ mkdir test
oli@bert:~/Desktop$ cd test
oli@bert:~/Desktop/test$ mkdir dir{0..100000}
oli@bert:~/Desktop/test$ touch filename{0..100000}

oli@bert:~/Desktop/test$ time /bin/ls>/dev/null

real    0m0.975s
user    0m0.860s
sys         0m0.110s

oli@bert:~/Desktop/test$ time ls --group-directories-first -l >/dev/null

real    0m1.810s
user    0m1.210s
sys         0m0.580s


oli@bert:~/Desktop/test$ time lss>/dev/null  # ændrük's method

real    0m2.035s
user    0m1.810s
sys         0m0.780s

oli@bert:~/Desktop/test$ time ~/bin/ls>/dev/null  # Oli's method

real    0m5.496s
user    0m4.290s
sys         0m1.460s
ændrük
sumber
4
Menambahkan beberapa tolok ukur ke posting Anda (seperti yang Anda sebutkan). Ya lebih dari 100.000 direktori dan 100.000 file, Anda membutuhkan waktu kurang dari setengahnya. Tetapi lsdengan sendirinya masih jauh lebih cepat. Either way, ini adalah kasus tepi. Kebanyakan orang tidak pernah memiliki daftar direktori sebesar ini. Untuk orang normal, ada sedikit perbedaan yang bisa diamati. Bagus sekali awk. +1
Oli
4

ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

Memperlihatkan ... direktori, file normal, tautan dalam urutan itu.

Jadikan sebagai alias dan Anda siap berangkat.

Menemukan metode lain:

ls -l --color -h --group-directories-first

Yang ini pertama-tama membuat direktori dan mewarnai nama file.

Di ~/.bashrcAnda dapat membuat alias untuk perintah ini seperti:

alias ls1='ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"

Output sampel:

drwxr-xr-x 5 96 2011-05-20 13:41.
drwxr-xr-x 16 xxxx uuuu 96 2010-03-05 12:34 ..
drwx ------ 2 xxxx uuuu 96 2009-02-13 14:31 .ssh
drwxrwxr-x 2 xxxx uuuu 96 2009-12-03 13:49 .xxx
drwxrwxr-x 5 xxxx uuuu 96 2010-12-06 15:51 xxxxxx
-rw ------- 1 xxxx uuuu 05 2011-05-20 14:12 .bash_history
-rw-r - r-- 1 xxxx uuuu 20 2009-02-12 09:33 .bash_logout
-rw-r - r-- 1 xxxx uuuu 29 2009-03-06 11:47 .bashrc
-rw-r - r-- 1 xxxx uuuu 80 2011-05-20 13:42 dst
-rw-rw-r-- 1 xxxx uuuu 03 2011-05-18 10:21 dffff

atau untuk yang kedua: alias ls2=ls -l --color -h --group-directories-first

Output sampel:

drwxrwxr-x 5 xxxx uuuu 4.0K 2010-12-06 15:51 ddddd
-rw-r - r-- 1 xxxx uuuu 339M 2011-05-20 13:42 sssss
-rw-rw-r-- 1 xxxx uuuu 4.6M 2011-05-18 10:21 dxsssss
-rwxrwxr-x 1 xxxx uuuu 68 2011-02-22 15:55 5555
-rwxr - r-- 1 xxxx uuuu 20K 2010-12-06 16:11 ffff
ddddd akan berwarna lain. tambahkan -ajuga sertakan file tersembunyi.

dan Anda membuat perintah ls1 dan ls2 untuk melakukan ini.

Rinzwind
sumber
2

Memperluas pengaturan alias di .bashrc adalah cara yang saya pilih untuk mendapatkan perintah 'ls' yang lebih nyaman. Saya suka terutama 'Jika' (membutuhkan instalasi 'pohon').

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias lf='tree -d -L 1'
Ralf Hersel
sumber
2

Salah satu alat paling kuat dalam sistem Unix adalah find perintah. Kita dapat menggunakannya untuk mengemulasi lsoutput dengan -lsflag dan mencari berdasarkan tipe file dengan -typeflag. Jadi, apa yang Anda lihat di bawah adalah perintah yang persis sama, tetapi dengan findmencari dua jenis yang berbeda. printfpernyataan hanya memberitahu Anda ingin listing terlebih dahulu.

printf "****DIRS****\n"; find . -maxdepth 1 -type d -ls; echo "****FILES****"; find . -maxdepth 1 -type f -ls

Berikut adalah contoh output:

CURRENT DIR:[/home/xieerqi/bin]
$ printf "****DIRS****"; find . -maxdepth 1 -type d -ls; echo "****FILES****"; find . -maxdepth 1 -type f -ls                                 
****DIRS****
5795516    4 drwxrwxr-x   8 xieerqi  xieerqi      4096 Aug 19 16:25 .
5795514    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./c
5795511    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./python
5795153    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:41 ./perl
5795532    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./random
5795531    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./sh
5795141    4 drwxrwxr-x   2 xieerqi  xieerqi      4096 Aug 19 15:27 ./cs2
****FILES****
5795538    4 -rw-rw-r--   1 xieerqi  xieerqi       178 Aug 19 16:25 ./somefile.txt
5795539    4 -rw-rw-r--   1 xieerqi  xieerqi       219 Aug 19 16:26 ./somefile2.txt

Perhatikan, yang findmencantumkan semua file, termasuk file yang tersembunyi dengan titik terkemuka, misalnya .bashrc.

Sekarang, untuk membuat perintah ini lebih mudah diakses, buat alias untuk itu di blog Anda .bashrc. Saya sudah membuat milik saya seperti itu

alias ls2='printf "****DIRS****\n"; find . -maxdepth 1 -type d -ls; echo "****FILES****"; find . -maxdepth 1 -type f -ls '

Sumber bashrc dengan . .bashrcatau keluar dan masuk terminal. Alias ​​Anda sekarang siap digunakan kapan saja Anda mau.

Sergiy Kolodyazhnyy
sumber
Alat paling ampuh? Memang. :)
AB
1

ls tidak mendukung banyak kustomisasi keluaran.

Menggunakan

 ls --group-directories-first -l

untuk mendapatkan dir terlebih dahulu.

Lihatlah limo (tidak diinstal secara default) untuk alternatif ls yang mendukung lebih banyak kustomisasi keluaran (tetapi tidak mendukung semua opsi ls)

Florian Diesch
sumber
0

lsMod terbaru saya ~/binadalah:

#!/bin/bash
ACCOUNT_ID=$UID
#
#SET ACCOUNT_NAME
ACCOUNT_NAME=$( cat /etc/passwd | grep $ACCOUNT_ID | cut -d: -f1 );

ls -l -F --color -h --group-directories-first $1 |\
    sed "s/$ACCOUNT_NAME/\$USER/g" | ack --passthru --color \\\$USER ;

PS Harus menyebutkannya ~/bin/mylsatau akan menggantung dalam lingkaran yang tidak pernah mencapai sistem ls.

Output sampel:

$ sudo mkdir -vp /temp/Nother_DIR | tee -a /tmp/record
mkdir: created directory `/temp'
mkdir: created directory `/temp/Nother_DIR'
$ sudo chown -vR $USER:$USER /temp | f | tee -a /tmp/record
changed ownership of `/temp/Nother_DIR' to $USER:$USER
changed ownership of `/temp' to $USER:$USER
$ cd /temp
$ touch a b c d
$ ln -sv d e | tee -a /tmp/record
`e' -> `d'
$ ln -sv e f | tee -a /tmp/record
`f' -> `e'
$ myls | tee -a /tmp/record
total 4.0K
drwxr-xr-x 2 $USER $USER 4.0K Sep 19 00:46 Nother_DIR
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 a
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 b
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 c
-rw-r--r-- 1 $USER $USER    0 Sep 19 00:46 d
lrwxrwxrwx 1 $USER $USER    1 Sep 19 00:46 e -> d
lrwxrwxrwx 1 $USER $USER    1 Sep 19 00:46 f -> e
saya sekarang
sumber
-1

Mod ls terbaru saya di ~ / bin adalah:

#!/bin/bash
ACCOUNT_ID=$UID
# 
#SET ACCOUNT_NAME
ACCOUNT_NAME=$( cat /etc/passwd | grep $ACCOUNT_ID | cut -d: -f1 );  

ls -l -F --color -h --group-directories-first $1 |\  
    sed "s/$ACCOUNT_NAME/\$USER/g" | ack --passthru --color \\\$USER ;  

Maaf tentang format posting. Mencoba membuat dapat digunakan melalui copy / paste, tapi mungkin tidak jalan. Bersulang!
PS Harus memberi nama ~ / bin / myls atau itu akan menggantung di loop yang tidak pernah mencapai sistem ls.

saya sekarang
sumber
ACCOUNT_NAME="$(getent passwd $UID | cut -d: -f1)"dan/bin/ls -l -F ...
waltinator