Làm thế nào tôi có thể sửa đổi lệnh `ls` của tôi?


12

Khi tôi nhập ls, tôi nhận được danh sách bình thường hoặc khi tôi nhập, ls -latôi nhận được phiên bản chi tiết với mọi thứ ...

Nhưng tôi ghét cách bố trí của lsnó, nó chỉ không trực quan cho hầu hết việc sử dụng của tôi.

Có cách nào để tôi có thể sửa đổi (mà không thay đổi mã nguồn của ls, các tập lệnh bash vẫn ổn không) lsvì vậy nó hiển thị thay vì

-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

Tôi có thể nhận được một danh sách như:

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

Hoặc một số biến thể khác.

Trong khi đó, bảo quản khả năng sử dụng cờ và các tùy chọn khác.

Câu trả lời:


15

Bạn có thể viết một tập lệnh bash được gọi là ~/bin/lsghi đè /bin/ls. nhớ để chạy chmod +x ~/bin/ls.

Tôi vừa mới viết cái này dường như làm hầu hết những gì bạn muốn thực hiện (bao gồm cả chuyển qua các đối số phụ)

#!/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

Ai đó có thể muốn dọn dẹp một chút hoặc cải thiện định dạng đầu ra, nhưng bạn đã đến đó. Bạn làm bất cứ điều gì bạn thích với.

Và đây là một số đầu ra mẫu chính hãng:

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

Và với các đối số:

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

7

Đây là cú đâm nhanh của tôi vào nó.

$ 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

Lợi ích của phương pháp này là nó không yêu cầu nhiều lần duyệt thư mục và in kết quả đầu ra khi nó sẵn sàng. Hãy thử chạy nó sau khi touch filename{0..10000}thử nghiệm.

Thả functionaliasdòng vào ~/.bashrcđể làm cho nó vĩnh viễn.

Điểm chuẩn từ 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

4
Đã thêm một số điểm chuẩn cho bài viết của bạn (như bạn đã đề cập). Vâng hơn 100.000 thư mục và 100.000 tệp, của bạn mất ít hơn một nửa thời gian. Nhưng lstrên chính nó vẫn nhanh hơn rất nhiều. Dù bằng cách nào, đây là một trường hợp cạnh. Hầu hết mọi người không bao giờ có danh sách thư mục lớn như vậy. Đối với người bình thường, có rất ít sự khác biệt có thể quan sát được. Đẹp awking mặc dù. +1
Oli

4

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

Hiển thị ... thư mục, tập tin bình thường, liên kết theo thứ tự đó.

Làm cho nó một bí danh và bạn được thiết lập để đi.

Tìm thấy một phương pháp khác:

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

Cái này làm thư mục đầu tiên và tô màu tên tập tin.

Trong ~/.bashrcbạn có thể tạo một bí danh cho lệnh này như vậy:

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

Đầu ra mẫu:

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 fff
-rw-rw-r-- 1 xxxx uuuu 03 2011-05-18 10:21 dffff

hoặc cho cái thứ hai: alias ls2=ls -l --color -h --group-directories-first

Đầu ra mẫu:

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 sẽ có màu khác. thêm -avào cũng bao gồm các tập tin ẩn.

và bạn đã tạo một lệnh ls1 và ls2 để làm điều này.


2

Mở rộng cài đặt bí danh trong .bashrc là cách ưa thích của tôi để nhận các lệnh 'ls' thuận tiện hơn. Tôi đặc biệt thích 'lf' (yêu cầu cài đặt 'cây').

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

2

Một trong những công cụ mạnh nhất trong các hệ thống Unix là findlệnh. Chúng ta có thể sử dụng nó để mô phỏng lsđầu ra với -lscờ và tìm kiếm theo loại tệp có -typecờ. Do đó, những gì bạn thấy dưới đây là cùng một lệnh, nhưng với findviệc tìm kiếm hai loại khác nhau. printfbáo cáo chỉ cho bạn biết nó muốn liệt kê đầu tiên.

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

Đây là đầu ra mẫu:

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

Lưu ý, ví dụ, findliệt kê tất cả các tệp, bao gồm các tệp ẩn có dấu chấm hàng đầu .bashrc.

Bây giờ, để làm cho lệnh này dễ truy cập hơn, hãy tạo một bí danh cho lệnh đó trong của bạn .bashrc. Tôi đã làm cho tôi như vậy

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

Nguồn bashrc có . .bashrchoặc thoát và nhập terminal. Bí danh của bạn đã sẵn sàng để sử dụng bất cứ lúc nào bạn muốn.


Công cụ mạnh nhất? Thật. :)
AB

1

ls không hỗ trợ nhiều tùy chỉnh đầu ra.

Sử dụng

 ls --group-directories-first -l

để chỉ nhận được các thư mục đầu tiên.

Hãy xem limo (không được cài đặt theo mặc định) để thay thế cho ls hỗ trợ tùy chỉnh đầu ra nhiều hơn (nhưng không hỗ trợ tất cả các tùy chọn của ls)


0

Bản lsmod mới nhất của tôi ~/binlà:

#!/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 Phải đặt tên cho nó ~/bin/mylshoặc nó sẽ bị treo trong vòng lặp không bao giờ đến được hệ thống ls.

Đầu ra mẫu:

$ 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

-1

Mod ls mới nhất của tôi trong ~ / bin là:

#!/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 ;  

Xin lỗi về định dạng của bài viết. Đã thử để có thể sử dụng thông qua sao chép / dán, nhưng có thể không đi. Chúc mừng!
PS phải đặt tên cho nó ~ / bin / myls hoặc nó sẽ bị treo trong vòng lặp không bao giờ đến được ls của hệ thống.


ACCOUNT_NAME="$(getent passwd $UID | cut -d: -f1)"/bin/ls -l -F ...
ví von
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.