ฉันจะแก้ไขคำสั่ง `ls 'ได้อย่างไร


12

เมื่อฉันพิมพ์lsฉันจะได้รับรายการปกติหรือเมื่อฉันพิมพ์ls -laฉันจะได้รับรายละเอียดทุกอย่าง ...

แต่ฉันเกลียดรูปแบบของlsมันเป็นเรื่องง่ายสำหรับการใช้งานส่วนใหญ่ของฉัน

มีวิธีที่ฉันสามารถแก้ไข (โดยไม่ต้องเปลี่ยน sorcecode ของls, สคริปต์ทุบตีก็โอเค) lsดังนั้นจึงแสดงแทน

-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

ฉันสามารถรับรายการที่ชอบมากขึ้น:

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

หรือรูปแบบอื่น ๆ

ในขณะเดียวกันการรักษาความสามารถในการใช้ธงและตัวเลือกอื่น ๆ

คำตอบ:


15

คุณสามารถเขียนสคริปต์ทุบตีที่เรียกว่าควรแทนที่~/bin/ls อย่าลืมที่จะทำงาน/bin/lschmod +x ~/bin/ls

ฉันเพิ่งเขียนสิ่งนี้ซึ่งดูเหมือนว่าจะทำสิ่งที่คุณต้องการให้สำเร็จ (รวมถึงการผ่านการโต้แย้งพิเศษ)

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

บางคนอาจต้องการจัดระเบียบเล็กน้อยหรือปรับปรุงการจัดรูปแบบผลลัพธ์ แต่คุณไป ของคุณที่จะทำสิ่งที่คุณต้องการด้วย

และนี่คือตัวอย่างผลลัพธ์ของแท้:

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

และด้วยข้อโต้แย้ง:

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

นี่คือกระทุ้งอันรวดเร็วของฉันที่มัน

$ 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

ประโยชน์ของวิธีการนี้คือไม่ต้องใช้การสำรวจเส้นทางหลายไดเรกทอรีและพิมพ์ผลลัพธ์เมื่อพร้อม ลองใช้วิธีนี้หลังจากtouch filename{0..10000}ทำการทดสอบ

วางfunctionและaliasบรรทัดลง~/.bashrcเพื่อให้ถาวร

การเปรียบเทียบจาก 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
เพิ่มการเปรียบเทียบบางอย่างในโพสต์ของคุณ (ดังที่คุณกล่าวถึง) ใช่มากกว่า 100,000 ไดเรกทอรีและ 100,000 ไฟล์คุณใช้เวลาน้อยกว่าครึ่ง แต่lsตัวมันเองก็ยังเร็วกว่ามาก ไม่ว่าจะด้วยวิธีใดกรณีนี้เป็นกรณีขอบ คนส่วนใหญ่ไม่เคยมีรายชื่อไดเรกทอรีขนาดใหญ่เช่นนี้ สำหรับคนปกติมีความแตกต่างที่สังเกตได้เล็กน้อย นีซawkไอเอ็นจีแม้ว่า +1
Oli

4

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

แสดง ... ไดเรกทอรี, ไฟล์ปกติ, ลิงก์ตามลำดับ

ทำให้เป็นชื่อแทนและคุณพร้อมที่จะไป

พบวิธีอื่น:

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

อันนี้ทำไดเร็กตอรี่ก่อนและใส่ชื่อไฟล์

ใน~/.bashrcคุณสามารถสร้างชื่อแทนคำสั่งนี้เช่น:

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

ตัวอย่างผลลัพธ์:

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

หรือสำหรับคนที่สอง: alias ls2=ls -l --color -h --group-directories-first

ตัวอย่างผลลัพธ์:

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 จะเป็นสีอื่น เพิ่ม-aไปยังรวมถึงไฟล์ที่ซ่อนอยู่

และคุณสร้างคำสั่ง ls1 และ ls2 เพื่อทำสิ่งนี้


2

การขยายการตั้งค่านามแฝงใน. bashrc เป็นวิธีที่ฉันต้องการในการรับคำสั่ง 'ls' ที่สะดวกยิ่งขึ้น ฉันชอบโดยเฉพาะ 'lf' (ต้องติดตั้ง 'tree')

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

2

หนึ่งในเครื่องมือที่ทรงพลังที่สุดในระบบ Unix คือfindคำสั่ง เราสามารถใช้มันเพื่อจำลองlsเอาท์พุทด้วยการ-lsตั้งค่าสถานะและค้นหาตามประเภทไฟล์พร้อม-typeแฟล็ก ดังนั้นสิ่งที่คุณเห็นร้องเป็นคำสั่งเดียวกัน แต่ด้วยfindการค้นหาสองประเภทที่แตกต่างกัน printfข้อความบอกเพียงว่าคุณต้องการให้มีรายชื่อก่อน

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

นี่คือตัวอย่างผลลัพธ์:

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

แจ้งให้ทราบว่าfindรายการทุก.bashrcไฟล์รวมถึงไฟล์ที่ซ่อนอยู่กับจุดชั้นนำเช่น

.bashrcตอนนี้ที่จะทำให้คำสั่งนี้ง่ายต่อการเข้าถึงสร้างนามแฝงว่าในของคุณ ฉันทำของฉันเป็นอย่างนั้น

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

bashrc แหล่งที่มาด้วย. .bashrcหรือออกและเข้าขั้ว นามแฝงของคุณพร้อมใช้งานได้ทุกเมื่อที่คุณต้องการ


เครื่องมือที่ทรงพลังที่สุด? จริง :)
AB

1

ls ไม่รองรับการปรับแต่งเอาต์พุตจำนวนมาก

ใช้

 ls --group-directories-first -l

เพียงแค่รับ dirs ก่อน

ดูที่ลิมูซีน (ไม่ได้ติดตั้งโดยค่าเริ่มต้น) เพื่อเป็นทางเลือกสำหรับ ls ที่รองรับการปรับแต่งเอาต์พุตเพิ่มเติม (แต่ไม่รองรับตัวเลือกทั้งหมดของls)


0

lsmod ล่าสุดของฉัน~/binคือ:

#!/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 ได้ตั้งชื่อให้มันหรือมันจะแขวนในวงที่ไม่เคยถึงระบบ~/bin/mylsls

ตัวอย่างผลลัพธ์:

$ 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

ls mod ล่าสุดของฉันใน ~ / bin คือ:

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

ขออภัยเกี่ยวกับรูปแบบของโพสต์ พยายามทำให้สามารถใช้งานได้ผ่านการคัดลอก / วาง แต่อาจจะไม่มีเลย ไชโย!
ป.ล. ต้องตั้งชื่อมันว่า ~ / bin / myls ไม่เช่นนั้นมันจะอยู่ในลูปที่ไม่ถึง ls ของระบบ


ACCOUNT_NAME="$(getent passwd $UID | cut -d: -f1)"และ/bin/ls -l -F ...
waltinator
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.