เมื่อฉันใช้ls
คำสั่งพร้อมตัวเลือก-l
สตริงตัวแรกจะให้ข้อมูลเกี่ยวกับแต่ละไฟล์และตัวอักษรตัวแรกในสตริงนี้จะให้ประเภทของไฟล์ ( d
= ไดเรกทอรี-
= ไฟล์มาตรฐานl
= ลิงค์ ฯลฯ )
ฉันจะกรองไฟล์ตามตัวอักษรตัวแรกได้อย่างไร
เมื่อฉันใช้ls
คำสั่งพร้อมตัวเลือก-l
สตริงตัวแรกจะให้ข้อมูลเกี่ยวกับแต่ละไฟล์และตัวอักษรตัวแรกในสตริงนี้จะให้ประเภทของไฟล์ ( d
= ไดเรกทอรี-
= ไฟล์มาตรฐานl
= ลิงค์ ฯลฯ )
ฉันจะกรองไฟล์ตามตัวอักษรตัวแรกได้อย่างไร
คำตอบ:
คุณสามารถกรองทุกอย่างยกเว้นไดเรกทอรีโดยใช้grep
วิธีนี้:
ls -l | grep '^d'
^
บ่งชี้ว่าแบบแผนคือจุดเริ่มต้นของบรรทัด แทนที่d
ด้วย-
,, l
ฯลฯ ตามความเหมาะสม
แน่นอนคุณสามารถใช้คำสั่งอื่น ๆ เพื่อค้นหาประเภทเฉพาะ (เช่นfind . -maxdepth 1 -type d
) โดยตรงหรือใช้ls -l | sort
เพื่อจัดกลุ่มประเภทที่คล้ายกันโดยใช้อักขระตัวแรกนี้ แต่ถ้าคุณต้องการกรองคุณควรใช้grep
เพื่อเลือกบรรทัดที่เหมาะสมจากผลลัพธ์เท่านั้น
ls -lL
คุณอาจต้องการที่จะใช้ -L
จะทำตาม symlinks เพื่อแสดงว่าลิงก์ไปยังไดเรกทอรีหรือไฟล์
หากคุณต้องการที่จะแสดงผลทั้งหมด แต่มีไฟล์ประเภทที่คล้ายกันอยู่ในรายการด้วยกันคุณสามารถเรียงลำดับการส่งออกในตัวอักษรตัวแรกของแต่ละบรรทัด:
ls -l | sort -k1,1
คำสั่งls
จัดการกับชื่อไฟล์ซึ่งถูกบันทึกไว้ในโครงสร้างข้อมูลไดเรกทอรี ดังนั้นจึงไม่สนใจเกี่ยวกับไฟล์เองรวมถึง "ประเภท" ของไฟล์
คำสั่งที่เหมาะสมมากขึ้นในการทำงานเกี่ยวกับไฟล์จริงไม่เพียง find
แต่ชื่อของมันคือ มีตัวเลือกที่ตอบคำถามของคุณโดยตรงเกี่ยวกับวิธีกรองรายการตามประเภทไฟล์
สิ่งนี้จะให้รายการของไดเรกทอรีปัจจุบันคล้ายกับls -l
:
find . -maxdepth 1 -ls
โดยค่าเริ่มต้นfind
รายการไดเรกทอรีซ้ำซึ่งถูกปิดใช้งานโดยการ จำกัด ความลึกของการค้นหาถึง 1
คุณสามารถออกจาก.
แต่ฉันรวมมันเพื่อแสดงไดเรกทอรีที่จะต้องมีการระบุไว้ก่อนตัวเลือก
ด้วย-type
คุณสามารถกรองตามประเภทไฟล์ซึ่งแสดงเป็นf
หรือd
สำหรับไฟล์หรือไดเรกทอรีธรรมดา:
find . -maxdepth 1 -type d -ls
มีค่าตัวกรองอื่น ๆ สำหรับ-type
โดยเฉพาะอย่างยิ่งl
สำหรับลิงก์สัญลักษณ์
โปรดทราบว่ามีความซับซ้อนที่ symlink :
มีสองประเภทของไฟล์ในกรณีนี้: l
ระบุ symlink และสิ่งที่คล้ายกันf
โดยระบุประเภทของไฟล์ที่เชื่อมโยง มีตัวเลือกเพื่อระบุวิธีจัดการกับสิ่งนั้นดังนั้นคุณสามารถเลือกได้
จากman find
:
-type c
File is of type c:
b block (buffered) special
c character (unbuffered) special
d directory
p named pipe (FIFO)
f regular file
l symbolic link; this is never true if the -L option
or the -follow option is in effect, unless the sym‐
bolic link is broken. If you want to search for
symbolic links when -L is in effect, use -xtype.
s socket
D door (Solaris)
และเกี่ยวข้องกับการจัดการลิงก์สัญลักษณ์:
-xtype c
The same as -type unless the file is a symbolic link. For
symbolic links: if the -H or -P option was specified, true
if the file is a link to a file of type c; if the -L option
has been given, true if c is `l'. In other words, for sym‐
bolic links, -xtype checks the type of the file that -type
does not check.
และ
-P Never follow symbolic links. This is the default behav‐
iour. When find examines or prints information a file, and
the file is a symbolic link, the information used shall be
taken from the properties of the symbolic link itself.
-L Follow symbolic links. When find examines or prints infor‐
mation about files, the information used shall be taken
from the properties of the file to which the link points,
not from the link itself (unless it is a broken symbolic
link or find is unable to examine the file to which the
link points). Use of this option implies -noleaf. If you
later use the -P option, -noleaf will still be in effect.
If -L is in effect and find discovers a symbolic link to a
subdirectory during its search, the subdirectory pointed to
by the symbolic link will be searched.
When the -L option is in effect, the -type predicate will
always match against the type of the file that a symbolic
link points to rather than the link itself (unless the sym‐
bolic link is broken). Using -L causes the -lname and
-ilname predicates always to return false.
-H Do not follow symbolic links, except while processing the
command line arguments. [...]
หากคุณกังวลมากที่สุดเกี่ยวกับการสั่งซื้อโฟลเดอร์จากไฟล์ประเภทอื่นคุณสามารถไปกับ
ls --group-directories-first
อื่นฉันคิดว่าคุณต้องท่อส่งออกจาก ls - l ผ่านการเรียงลำดับหรือผ่าน grep ตามที่ตอบโดย Anthon
ls -l | awk '/^d/{print $NF}
awk จะจับทุกอย่างที่ขึ้นต้นด้วย d เช่นเดียวกับไดเร็กตอรี่และคุณต้องพิมพ์ฟิลด์สุดท้ายเพื่อแสดงรายการชื่อไดเร็กตอรี่
ls -l | sort
นี่จะเรียงลำดับผลลัพธ์ตามลำดับตัวอักษรของแต่ละผลลัพธ์ ถ้าตัวละครตัวแรกเป็นเกณฑ์ที่คุณต้องการนั่นก็คือ หากคุณต้องการชื่อไฟล์เท่านั้นคุณสามารถลอง:
ls -l | sort | cut -f 2 -d ' '
หรือสิ่งที่คล้ายกัน (คำสั่งนั้นเรียงลำดับแล้วแยกแต่ละบรรทัดโดยใช้ตัวคั่นช่องว่างจากนั้นส่งคืนกลุ่มที่สอง