วิธีการเรียงลำดับไดเรกทอรีแรกแล้วไฟล์ ฯลฯ ... เมื่อใช้“ ls” ใน Unix


77

ฉันต้องการใช้ ls คำสั่งเพื่อแสดงไดเรกทอรีแรกแล้วไฟล์ ฉันเหนื่อย:

ls -la | sort -k 1

แต่ฉันได้รับคำสั่งผิด


มันเป็นเพราะว่า - มาก่อน d เมื่อใช้ sort
Nifle

4
หัว unix แบบเก่า (อันที่มาจากยุค pre-GUI) ที่ใช้ในการตั้งชื่อโฟลเดอร์ให้เป็นตัวพิมพ์ใหญ่และสร้างชื่อไฟล์ธรรมดาโดยไม่มีการตัดตอน
JRobert

คำถามที่มีประโยชน์! บางทีอาจถึงเวลาเปลี่ยนคำตอบที่ยอมรับแล้วสำหรับคำตอบที่ง่ายกว่าและไม่ทำให้สีของเทอร์มินัลเสียหาย
ippi

คำตอบ:


24

คำสั่งต่อไปนี้จะแสดงรายการไดเรกทอรีก่อนไฟล์ธรรมดาที่สองและลิงก์ที่สาม

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

นอกจากนี้มันจะทำให้รู้สึกอย่างมากในการสร้าง นามแฝง สำหรับคำสั่งนี้เพื่อบันทึกการกดแป้น

แก้ไข:

หากคุณต้องการไดเรกทอรีก่อนจากนั้นทุกสิ่งที่ไม่ใช่ไดเรกทอรีที่สองให้ใช้สิ่งนี้:

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


1
คำสั่งนี้จะไม่แสดงรายการทุกอย่างหากมีซ็อกเก็ตหรือ FIFO ในโฟลเดอร์
Studer

1
เวอร์ชันที่แก้ไขนั้นควรทำงานกับประเภทอื่น ๆ ได้ grep ตัวแรกบอกทุกอย่างที่ขึ้นต้นด้วย 'd' และอันที่สองบอกทุกอย่างที่ไม่ได้ขึ้นต้นด้วย 'd' แน่นอนทุกอย่างเริ่มต้นด้วย d หรือไม่ใช่ไหม
Ry4an Brase

1
@ Mark - ทำไมไม่ทำแค่: ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"?
FCTW

1
ในการทำให้คำสั่ง @ FCTW เป็นนามแฝง OSX ให้เพิ่มสิ่งนี้ใน ~ / .profile ของคุณ: alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
aliteralmind

2
ฉันพบสัญกรณ์ที่สั้นลง ls -la|grep ^d;ls -la|grep -v ^d (ไม่จำเป็นต้องใส่เครื่องหมายคำพูดและแทนที่ && กับ ; ) อีกทางเลือกหนึ่งคือการแนะนำตัวแปรและประเมินค่า: a="ls -la|grep ^d";eval $a;eval $a -v. อาจเป็นประโยชน์ในการหลีกเลี่ยงการทำซ้ำเมื่อมีการระบุตัวเลือกเพิ่มเติม ls / grep. นอกจากนี้ยังมีที่ ls -la --group-directories-first ตัวเลือกอย่างไรก็ตาม imo ที่สั้นที่สุดคือ ls -la|sort
Steven Pribilinskiy

184

ฉันชอบ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)) และรักการเห็นความคิดสร้างสรรค์

ของฉันไม่ได้เกือบเป็นแฟนซีบน GNU Linux:

alias ls='ls --color -h --group-directories-first'

เนื่องจากฉันรู้สึกสะดวกสบายมากขึ้นกับแอพพลิเคชั่น linux CLI ของฉันฉันมักจะอัปเดต coreutils บน OSX ด้วย:

brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'

4
น่าเสียดายที่นี่ใช้ไม่ได้กับ osx terminal เนื่องจาก - ไม่มีตัวเลือก
MEM

7
ที่รัก: การเสียดสีนั่นใช่ไหม ถ้าเป็นเช่นนั้นฉันก็เห็นด้วย
allyourcode

3
Re: ใช้งานไม่ได้บน mac ... จริงเพียงพอส่วนตัวแล้วโดยทั่วไปฉันจะติดตั้งชง coreutils เพื่อแทนที่ mac builtins สำหรับผู้ใช้ในพื้นที่ของฉัน
jonathanserafini

4
วัตถุประสงค์ของนามแฝง ls คือการกำหนดองค์ประกอบการกำหนดค่าที่ฉันต้องการใช้ 90% ของเวลา กดแป้นน้อยกว่าเพื่อให้ได้ผลลัพธ์ที่ต้องการ หากคุณต้องการมีเอาต์พุต ls ดั้งเดิมคุณสามารถ / bin / ls ได้ตลอดเวลา
jonathanserafini

4
@MEM หากคุณใช้ OS X และคุณชอบใช้ Terminal คุณควร brew install bash จากนั้นจะใช้งานได้! :)
Andrew Ashbacher

16

สำหรับผู้ใช้ Mac coreutils :

brew install coreutils

alias ls='ls --color -h --group-directories-first'

สมมติว่าระบบของคุณพร้อมแล้ว homebrew :


4
gls ค่อนข้าง ขวา?
Paul Irish

1
ใช่โดยค่าเริ่มต้น คุณยังสามารถใช้ coreutils ตามค่าเริ่มต้นด้วย PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH".
benesch

6

คุณมีหลายทางเลือกขึ้นอยู่กับว่าคุณต้องการเรียงตามตัวอักษร

คุณสามารถลอง:

ls -al | sort -k1 -r

หรือนี่คือการเรียงลำดับตามตัวอักษรสำหรับไฟล์ที่มีสิทธิ์เหมือนกัน:

ls -al | sort -k1,1 -k9,9 -r

หรืออย่างที่ eleven81 พูด (แต่เวอร์ชั่นนี้แสดงทุกอย่าง)

ls -la | grep "^ d" & amp; & amp; ls -la | grep "^ -" & amp; & amp; ls -al | grep -v "^ [d | -]"


1
นี่คือโซลูชั่นที่ดีกว่า IMO การใช้กระบวนการและท่อหลาย ๆ แบบในการเรียงลำดับแทนที่จะเป็นแบบท่อเพื่อจัดเรียงนั้นดูค่อนข้างล้าหลัง โดยเฉพาะอย่างยิ่งตั้งแต่ ls- al|sort -k1 -r โรงงาน สิ่งที่ขาดหายไปก็คือ -r ธง.
brice

@ ราคาสิ่งที่รบกวนฉันเกี่ยวกับ 'การเรียงลำดับ' คือ ./ และ ../ จะไม่เป็นสองบรรทัดแรกตามลำดับ นอกจากนั้นฉันยอมรับว่ามันเป็นทางออกที่มีประสิทธิภาพมากขึ้น
thdoan

5

ไปยัง delerious010 ของ คำตอบฉันจะเพิ่มว่าถ้าคุณต้องการการสั่งซื้อแบบเก่า:

LANG=C ls -la --group-directories-first

(หรือใช้ LC_ALL หรือ LANGUAGE หรือ LC_COLLATE ตั้งไว้ที่ "C")

สิ่งนี้จะให้สิ่งที่คล้ายกับ:

.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file

แม้ว่าถ้าฉันจำได้อย่างถูกต้อง แต่เดิมจุดไฟล์ที่ซ่อนอยู่ปรากฏขึ้นก่อนหน้าไดเรกทอรี


4

มีบางสิ่งที่ฉันต้องการเห็นในรายการไดเรกทอรีและจนถึงขณะนี้ยังไม่มีคำตอบใดตรงกับข้อกำหนดทั้งหมดด้านล่าง ข้อกำหนดของฉันสำหรับรายชื่อไดเรกทอรี:

  1. ไดเรกทอรีและไฟล์จะถูกจัดเรียงตามตัวอักษร
  2. ไดเรกทอรีมีการระบุไว้ก่อน
  3. ลิงก์สัญลักษณ์ (symlinks) เรียงลำดับเหมือนไฟล์
  4. การเรียงลำดับไม่คำนึงถึงขนาดตัวพิมพ์
  5. การเรียงลำดับจะไม่สนใจอักขระที่ไม่ใช่ตัวอักษรนำทั้งหมดในชื่อไฟล์
  6. รายการรวมถึงจำนวนรวมของไดเรกทอรี (ไม่รวม ./ และ ../ ) ไฟล์และลิงก์
  7. รายการรวมถึงขนาดทั้งหมด (การใช้งานดิสก์) ของไดเรกทอรีและไฟล์
  8. รายชื่อจะต้องมีลักษณะเหมือนกันบน Linux และ Windows (Git Bash shell) - นี่เป็นสิ่งที่ยากที่สุดที่จะได้รับตั้งแต่ตัวเลือกที่สะดวกสบายเช่น --group-directories-first ไม่ทำงานใน Git Bash สำหรับ Windows

หลังจากการแฮ็คมานานมากในที่สุดฉันก็พบกับหนึ่งซับ (แม้ว่าจะเป็นบรรทัดที่ยาวมาก ;-)) ที่ฉันพอใจ ฉันได้มอบหมายสิ่งนี้ให้กับนามแฝงที่ชื่อว่า '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\)

เพื่อให้การจัดการง่ายขึ้นฉันจึงมีคำสั่งแยกออกมาเพื่อแสดงแต่ละส่วนของรายการไดเรกทอรีตามความชอบของฉันจากนั้นจึงรวมเข้าด้วยกันโดยใช้ && ผู้ประกอบการ

  • ls -dlF --color * .* | head -n2 - สารสกัด ./ และ ../. เราไม่ต้องการผ่านสิ่งเหล่านี้ผ่าน sort เพราะพวกเขาอยู่ในลำดับที่ถูกต้องแล้วและการเรียงลำดับอาจส่งผลให้ ../ เป็นรายการแรก -d ตัวเลือกคือการกำจัดของบรรทัด "รวม"; ฉันชอบที่จะเพิ่ม -F เพื่อแสดง slash ต่อท้ายสำหรับไดเรกทอรี (มันจะทำเครื่องหมาย symlink ด้วย "@" เมื่อคุณทำ ls -F )

  • ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df - แยกไดเรกทอรีและจัดเรียงตามชื่อไฟล์ (คอลัมน์ที่ 9) โดยไม่สนใจอักขระที่ไม่ใช่ตัวอักษร / ช่องว่าง d ตัวเลือก) และกรณีตัวละคร ( f ตัวเลือก) ls -A ตัวเลือกไม่รวม ./ และ ../ จากรายชื่อเนื่องจากเราได้แยกพวกเขาในขั้นตอนก่อนหน้า ฉันมักจะนำหน้าทั้งหมด grep และ sort คำสั่งด้วย LC_ALL=C รีเซ็ตโลแคลเพื่อ (1) เอาต์พุตสอดคล้องกันทั่วเชลล์ Unix และ (2) บางครั้งคุณสามารถเห็นประสิทธิภาพได้เร็วขึ้นเนื่องจากไม่มีโอเวอร์เฮดของชุดอักขระ UTF-8 จำนวนมาก

  • ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df - นี่คล้ายกับขั้นตอนข้างต้น แต่คราวนี้เรากำลังจัดเรียงไฟล์และ symlink

  • find -maxdepth 1 -type d ! -name . | wc -l - รับจำนวนไดเรกทอรีไม่รวม ./ และ ../.

  • find -maxdepth 1 -type f | wc -l - รับจำนวนไฟล์

  • find -maxdepth 1 -type l | wc -l - รับจำนวน symlink

  • du -hs | cut -f 1 - แยกขนาดรวมของไดเรกทอรีย่อยทั้งหมดในรูปแบบที่มนุษย์อ่านได้

  • find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1 - แยกขนาดทั้งหมดของไฟล์ทั้งหมดในรูปแบบที่มนุษย์อ่านได้

เรามาดูใหม่ของเรา dir นามแฝงในการดำเนินการ!

ก่อน:

$ 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/

หลังจาก:

$ 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)

ข้อเสียเล็กน้อยอย่างหนึ่งคือคุณไม่สามารถมีรายชื่อสีได้เนื่องจากตัวควบคุมสีที่ล้อมรอบชื่อไฟล์ทำให้การเรียงลำดับไม่น่าเชื่อถือ


UPDATE

นามแฝงด้านบนนั้นทำงานช้ามากเมื่อดำเนินการจากไดเรกทอรีรากของระบบไฟล์ที่ลึกดังนั้นฉันได้อัปเดตเป็นคำสั่งที่ง่ายกว่า

ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'

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

$ 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

เนื่องจาก Git Bash รุ่นใหม่สำหรับ Windows รองรับ --group-directories-firstเราไม่จำเป็นต้องถอยกลับไป sort. แม้ว่านามแฝงใหม่จะไม่แสดงข้อมูลมากเท่ากับนามแฝงก่อนหน้า แต่ประสิทธิภาพเพิ่มขึ้นก็คุ้มค่า คุณจะได้รับสีสันด้วยเช่นกัน!


คำตอบที่ดี! แต่เมื่อคุณพูด “ หลังจากการแฮ็คมานานมากในที่สุดฉันก็เกิดขึ้นกับสายการบินเดียว…” ใช่แน่นอนว่าไม่ใช่ "หนึ่งซับ" ในความรู้สึกแบบคลาสสิก มันอาจสมเหตุสมผลที่จะใช้ตรรกะนั้นและทำให้เป็นเชลล์สคริปต์แบบสแตนด์อโลนและเพียงเรียกใช้หรือเรียกมันว่าเป็นนามแฝง
JakeGould

@ JakeGould คุณเร็ว! ฉันยังไม่ได้อ่านหลักฐานคำตอบของฉันเสร็จแล้วและคุณอ่านจบแล้วและคอมเม้นท์ :) ใช่มันเป็นตัวเลือกอันดับหนึ่งสำหรับฟังก์ชั่น แต่ฉันขี้เกียจเกินไปในเวลานั้นดังนั้นเพียงแค่โยนมันลงในไฟล์. bash_aliases ของฉัน ในทางตรงกันข้ามฉันมักจะเขียนฟังก์ชั่นเฉพาะเมื่อฉันไม่สามารถทำอะไรบางอย่างโดยไม่ผ่านพารามิเตอร์
thdoan

@ 10basetom: คำถามด่วน: คุณจะได้สีต่างกันสำหรับคอลัมน์ใน ls ได้อย่างไร ฉันสามารถระบายสี ชื่อไฟล์ โดย filetype โดยใช้ ls --color แต่ฉันไม่เห็นวิธีรับสีที่เป็นประโยชน์เหล่านั้นสำหรับคอลัมน์ ความลับคืออะไร?
Pirx

@Pirx ฉันเชื่อว่าคอลัมน์มีสีตามการเน้นไวยากรณ์ของ Exchange Exchange เป็นค่าเริ่มต้น :-)
thdoan

ใช่ว่าเป็นกรณี แต่มันเป็นความคิดที่ดีและการแก้ปัญหาอยู่ใน ;-)
Pirx

2

นี่คือฟังก์ชั่นในการทำเช่นนี้ (bash หรือ zsh): และ ... ฉันไม่ได้บอกว่านี่เป็นวิธีที่ดีที่สุด แต่เป็นวิธีที่ฉันใช้และตอนนี้:

function lss
{
    # Shows directory listing with directories at the top.

    command ls  --color=always $@ | egrep '^d|total'
    command ls  --color=always $@ | egrep -v '^d|total';
}

เพียงแค่ fyi สิ่งนี้ไม่สามารถใช้งานได้ คุณต้องใช้รูปแบบรายชื่อยาว ls -l ) เพื่อกรองตามประเภทไฟล์เช่นนั้น นอกจากนี้คำสั่งนี้จะทำลายช่องว่าง (ในทุบตี) คุณจำเป็นต้องอ้างเช่น: "$@" หากคุณต้องการใช้วิธีการนี้คุณสามารถทำสิ่งต่อไปนี้: function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
Six

1

อีกวิธีหนึ่ง ...

find . -d 1 -type d | ls -la | sort -r 

หรือ

ls -la | sort -r

หรือ

d=`find . -type d -d 1`;f=`find . -type f -d 1`; echo -e -DIRS- "\n$d\n" -FILES- "\n$f"

สิ่งเหล่านี้ทำอะไร คุณเรียนรู้ที่จะพิมพ์พวกเขาที่ไหน
Tom Wijsman

ระบบปฏิบัติการที่ฉันต้องการคือ Debian Linux gnu core ของแพ็คเกจ Debian ของ ls รองรับตัวเลือก --show-directory- ตัวเลือกแรก ... เมื่อฉันเริ่มใช้ OSX ฉันเพิ่งคว้าไฟล์ bash dot ทั้งหมดของฉันจากกล่อง Debian ของฉันและวางไว้ในไดเรกทอรีบ้านของฉัน ... ฉัน มี bash_aliases จำนวนมากที่พังดังนั้น ... ตอนนั้นฉันต้องหาวิธีแก้ปัญหาแทนนามแฝงของฉัน ...
Eddie B

อันแรกค่อนข้างซ้ำซ้อน ... ไม่มีเหตุผลที่จะเรียงลำดับไดเรกทอรีเพราะมันเป็นลำดับที่เราต้องแก้ไขไม่ใช่ไดเรกทอรี ... 'ls -la | sort -r 'เป็นสิ่งที่ใช้งานได้จริง โดยพื้นฐานแล้วมันระบุว่า ... 1) A) ค้นหา -d 1 -type d (เริ่มต้นจากไดเรกทอรีนี้ค้นหาความลึกหนึ่งไดเรกทอรีและค้นหาไดเรกทอรีเท่านั้น) B) ls -la (รายการไฟล์คุณลักษณะทั้งหมด) C) เรียงลำดับพวกเขาในสิ่งที่ตรงกันข้าม 2) ทำตาม 1) เพียงแค่ค้นหา .. ไม่จำเป็น ... ฉันชอบวิธีการแก้ปัญหาของ Studers ดีกว่า ... :-)
Eddie B

1

ls -laX จะแสดงไดเรกทอรีแรกตามลำดับตัวอักษร แต่จะขันรายการไฟล์

ตัวเลือกยาว:

ls
    -l    # List
    --all
    -X    # Sort alphabetically by entry extension

สิ่งนี้จะใช้ได้ถ้าคุณมั่นใจได้อย่างแน่นอนว่าทุกไดเรกทอรีไม่มีจุดในชื่อ
eleven81

1

TL; DR

alias ls='ls -lhF --color'

list_sorted() {
    ls $* | grep "^d";
    ls $* | grep "^-";
    ls $* | grep -v -E "^d|^-|^total"
}

alias ll=list_sorted

คำอธิบาย

ฉันใช้การผสมผสานของโซลูชั่นที่ให้ไว้ในคำตอบและความคิดเห็นที่นี่

ค่าเริ่มต้น ls

ก่อนอื่นฉันเขียนทับพฤติกรรมเริ่มต้นสำหรับ ls:

  • -l: แสดงรายการเป็นรายการแนวตั้งหนึ่งมิติเสมอ
  • -h: แสดงขนาดไฟล์ใน มนุษย์สามารถอ่านได้ แฟชั่น (เช่น 4.0K แทน 4096)
  • -F: แสดงตัวบ่งชี้เช่นเครื่องหมายทับต่อท้ายสำหรับไดเรกทอรี
alias ls='ls -lhF --color'

ขยาย ll

ต่อไปฉันเขียนฟังก์ชันที่มีลอจิกการเรียง แต่ละ ls ฉันผ่านข้อโต้แย้งใด ๆ ที่ส่งผ่านไปยังเดิม ทำให้ฉันสามารถใช้นามแฝงจากไดเรกทอรีการทำงานที่แตกต่างจากที่ฉันต้องการแสดงรายการ (เช่น ls -a ~ )

นอกจากนี้แต่ละสายไปยัง ls ถูกส่งไปยัง grep คำสั่ง ที่นี่การเรียงลำดับเกิดขึ้น ls -l | grep "^d" ตัวอย่างเช่นแสดงรายการไดเรกทอรีเท่านั้น หากควรแสดงรายการไดเรกทอรีก่อนสิ่งนี้ต้องมาก่อนในฟังก์ชันด้วย สิ่งต่อไปคือไฟล์

สุดท้ายฉันจะแสดงทุกอย่างที่ไม่ใช่ไดเรกทอรีหรือไฟล์ (หรือบรรทัดที่แสดงขนาดรวมของเนื้อหาไดเรกทอรี) สิ่งนี้ทำได้โดยการ grepping directoy รายการไฟล์ปกติและรายการทั้งหมดจากนั้นสลับผลลัพธ์ผ่านทาง -v ข้อโต้แย้ง.

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"
}

ในที่สุดฉันก็ใช้ฟังก์ชันแทนคำสั่งใหม่ โดยเฉพาะฉันไม่ต้องการเขียนทับ ls ในกรณีที่ฟังก์ชั่นของฉันแตกในบางสถานการณ์ จากนั้นฉันต้องการที่จะสามารถใช้ ls. หรือคุณสามารถเรียกใช้นามแฝงได้ตลอดเวลา ls คำสั่งโดยการเรียก \ls.

alias ll=list_sorted

หมายเหตุ

  • ฉันใช้ ; แทน && เป็นตัวคั่นสำหรับคำสั่ง มิฉะนั้นจะไม่สามารถแสดงรายการเนื้อหาของไดเรกทอรีที่ไม่มีไดเรกทอรี (คำสั่ง ls แรกประเมินว่าเป็นเท็จดังนั้นจึงไม่อนุญาตให้เรียกใช้งานคำสั่งถัดไปเนื่องจากมีการเชื่อมโยงกับ &&. ; หลีกเลี่ยงสิ่งนั้น)

0

นี่คือโซลูชันสคริปต์ แสดงรายการเฉพาะชื่อ, ไม่มีข้อมูล inode, เรียงตามตัวอักษร, ไม่ตรงตามตัวพิมพ์ใหญ่ - เล็ก แม้ว่ามันจะเป็นแถวหลักแทนที่จะเป็นคอลัมน์หลักเช่นเอาท์พุทเริ่มต้นของ ls คอลัมน์มีความยุ่งเหยิงเล็กน้อยหากมีชื่อไฟล์ที่มี & gt; 26 ตัวอักษร

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[@]}"

และอีกอันหนึ่งด้วยการจัดรูปแบบพิเศษบางอย่าง

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[@]}"

เอาต์พุตสำหรับอันสุดท้ายดูเหมือนว่าต่อไปนี้ลบด้วยสี:

  ---- 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

เพียงจำไว้ว่าอย่าใช้นามแฝงหรือเปลี่ยนพฤติกรรมเริ่มต้นของ ls เนื่องจากสคริปต์นี้เรียกใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.