ฉันต้องการใช้ ls
คำสั่งเพื่อแสดงไดเรกทอรีแรกแล้วไฟล์ ฉันเหนื่อย:
ls -la | sort -k 1
แต่ฉันได้รับคำสั่งผิด
ฉันต้องการใช้ ls
คำสั่งเพื่อแสดงไดเรกทอรีแรกแล้วไฟล์ ฉันเหนื่อย:
ls -la | sort -k 1
แต่ฉันได้รับคำสั่งผิด
คำตอบ:
คำสั่งต่อไปนี้จะแสดงรายการไดเรกทอรีก่อนไฟล์ธรรมดาที่สองและลิงก์ที่สาม
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
นอกจากนี้มันจะทำให้รู้สึกอย่างมากในการสร้าง นามแฝง สำหรับคำสั่งนี้เพื่อบันทึกการกดแป้น
แก้ไข:
หากคุณต้องการไดเรกทอรีก่อนจากนั้นทุกสิ่งที่ไม่ใช่ไดเรกทอรีที่สองให้ใช้สิ่งนี้:
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
(ไม่จำเป็นต้องใส่เครื่องหมายคำพูดและแทนที่ &&
กับ ;
) อีกทางเลือกหนึ่งคือการแนะนำตัวแปรและประเมินค่า: a="ls -la|grep ^d";eval $a;eval $a -v
. อาจเป็นประโยชน์ในการหลีกเลี่ยงการทำซ้ำเมื่อมีการระบุตัวเลือกเพิ่มเติม ls
/ grep
. นอกจากนี้ยังมีที่ ls -la --group-directories-first
ตัวเลือกอย่างไรก็ตาม imo ที่สั้นที่สุดคือ ls -la|sort
ฉันชอบ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)) และรักการเห็นความคิดสร้างสรรค์
ของฉันไม่ได้เกือบเป็นแฟนซีบน 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'
brew install bash
จากนั้นจะใช้งานได้! :)
สำหรับผู้ใช้ Mac coreutils :
brew install coreutils
alias ls='ls --color -h --group-directories-first'
สมมติว่าระบบของคุณพร้อมแล้ว homebrew :
gls
ค่อนข้าง ขวา?
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
.
คุณมีหลายทางเลือกขึ้นอยู่กับว่าคุณต้องการเรียงตามตัวอักษร
คุณสามารถลอง:
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 | -]"
ls- al|sort -k1 -r
โรงงาน สิ่งที่ขาดหายไปก็คือ -r
ธง.
./
และ ../
จะไม่เป็นสองบรรทัดแรกตามลำดับ นอกจากนั้นฉันยอมรับว่ามันเป็นทางออกที่มีประสิทธิภาพมากขึ้น
ไปยัง 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
แม้ว่าถ้าฉันจำได้อย่างถูกต้อง แต่เดิมจุดไฟล์ที่ซ่อนอยู่ปรากฏขึ้นก่อนหน้าไดเรกทอรี
มีบางสิ่งที่ฉันต้องการเห็นในรายการไดเรกทอรีและจนถึงขณะนี้ยังไม่มีคำตอบใดตรงกับข้อกำหนดทั้งหมดด้านล่าง ข้อกำหนดของฉันสำหรับรายชื่อไดเรกทอรี:
./
และ ../
) ไฟล์และลิงก์ --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
. แม้ว่านามแฝงใหม่จะไม่แสดงข้อมูลมากเท่ากับนามแฝงก่อนหน้า แต่ประสิทธิภาพเพิ่มขึ้นก็คุ้มค่า คุณจะได้รับสีสันด้วยเช่นกัน!
นี่คือฟังก์ชั่นในการทำเช่นนี้ (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'; }
ls -l
) เพื่อกรองตามประเภทไฟล์เช่นนั้น นอกจากนี้คำสั่งนี้จะทำลายช่องว่าง (ในทุบตี) คุณจำเป็นต้องอ้างเช่น: "$@"
หากคุณต้องการใช้วิธีการนี้คุณสามารถทำสิ่งต่อไปนี้: function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
อีกวิธีหนึ่ง ...
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"
ls -laX
จะแสดงไดเรกทอรีแรกตามลำดับตัวอักษร แต่จะขันรายการไฟล์
ตัวเลือกยาว:
ls
-l # List
--all
-X # Sort alphabetically by entry extension
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 แรกประเมินว่าเป็นเท็จดังนั้นจึงไม่อนุญาตให้เรียกใช้งานคำสั่งถัดไปเนื่องจากมีการเชื่อมโยงกับ &&
. ;
หลีกเลี่ยงสิ่งนั้น) นี่คือโซลูชันสคริปต์ แสดงรายการเฉพาะชื่อ, ไม่มีข้อมูล 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 เนื่องจากสคริปต์นี้เรียกใช้
-
มาก่อนd
เมื่อใช้sort