ระบุไฟล์และไดเรกทอรีด้วยคำสั่ง 'ls'


11

เรียกใช้คำสั่งlsบนไดเรกทอรีปัจจุบันและรับผลลัพธ์:

$ ls
Applications Documents    Library      Music        Public
Desktop      Downloads    Movies       Pictures

ฉันต้องการแจกแจงพวกเขาเช่น:

1. Applications
2. Desktop
3. Documents
4. Downloads
5. Library
6. Movies
7. Music
8. Pictures
9. Public

สิ่งนี้สามารถทำได้โดยใช้วิธีlessการระดับกลาง

ls | less -N

วิธีการระบุพวกเขาในทางตรงไปตรงมา?


คุณต้องการให้มันเกิดขึ้นเสมอหรือบางครั้ง? ในกรณีแรกคุณสามารถสร้างนามแฝงของ ls ให้กับหนึ่งในคำสั่งในคำตอบ ในครั้งที่สองให้สร้างนามแฝงใหม่ - พูด "lsn" กับคำสั่ง
jamesqf

คำตอบ:


16

หรือทำ:

ls -b |nl -s '. ' -w 1
1. a\ file\ with\ nonewline
2. a\ file\ with\nnewline
3. a\ file\ with\ space
4. afile

จากman nl:

-s, --number-separator=STRING
              add STRING after (possible) line number
-w, --number-width=NUMBER
              use NUMBER columns for line numbers

13

คุณควรไพพ์เอาท์พุทของlsไปยังคำสั่งอื่น คำแนะนำของฉันคือการใช้awkในลักษณะนี้ :

$ ls -b --group-directories-first | awk '{print NR ". " $0}'
1. dir1
2. dir2
3. dir3
4. z-dir1
5. z-dir2
6. z-dir3
7. file1
8. file2
9. file3
10. file4
11. file5
12. file6
13. file7
14. file\nnewline
  • โปรดทราบว่าแฟ้มfile\nnewlineประกอบด้วยอักขระขึ้นบรรทัดใหม่ในชื่อที่รอดด้วยตัวเลือก\n-b

  • ตัวเลือก--group-directories-firstจะส่งออกไดเรกทอรีก่อนไฟล์

อีกวิธีที่เป็นไปได้คือใช้สำหรับลูป (แต่ในกรณีนี้เพื่อวางไดเรคทอรี่ในการขอรายการจะกลายเป็นเรื่องยากมากขึ้น):

n=1; for i in *; do echo $((n++)). $i; done

11

หากเพียงแค่แสดงตัวเลขเป็นกรณีคุณมีหลายตัวเลือกดังต่อไปนี้เช่นเดียวกับless -Nวิธีของคุณ:

$ ls |cat -n
$ ls |nl

หากคุณต้องการกำหนดหมายเลขเอาท์พุทที่กำหนดเองฉันขอแนะนำให้ใช้findและทำสิ่งที่คุณต้องการพิมพ์:

find . -exec bash -c 'for fnd; do printf "%d. %s\n" "$((++i))" "$fnd"; done ' _ {} +

POSIXly คุณจะทำ:

find . -exec sh -c 'for fnd; do i=$((i+1)); printf "%d.\t%s\n" "$i" "$fnd"; done ' _ {} +

ในกรณีนี้iต้องมีการเตรียมใช้งานล่วงหน้า:i=0; find ...
rexkogitans

ไม่จำเป็นต้องอยู่ที่นี่เนื่องจาก-exec sh -c '....' กำลังทำงานภายใต้เชลล์แยกต่างหาก
αғsнιη

3

คุณสามารถทำสิ่งนี้ได้อย่างสมบูรณ์ด้วยสคริปต์ Bash สั้น ๆ :

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
i=0
for f in *; do
    printf '%d. %s\n' "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

คุณสามารถแฟนซีและใส่หมายเลขบรรทัดสำหรับผลลัพธ์มากกว่า 9 รายการ:

#!/bin/bash
set -eu
shopt -s nullglob

[ "$#" -eq 0 ] || cd -- "$1"
ls=(*)
pad=${#ls[@]}
pad=${#pad}
i=0
for f in *; do
    printf '%*d. %s\n' "$pad" "$((++i))" "${f//$'\n'/^N}"
done |
cat -vt

การใช้

สมมติว่าคุณบันทึกสคริปต์เป็นไฟล์numbered-ls.shเรียกทำงานในไดเรกทอรีการทำงานปัจจุบัน:

./numbered-ls.sh [DIRECTORY]

อาร์กิวเมนต์DIRECTORYเป็นทางเลือกและมีค่าเริ่มต้นเป็นไดเรกทอรีการทำงานปัจจุบัน

คำอธิบาย

  1. หากสคริปต์ถูกเรียกใช้พร้อมกับอาร์กิวเมนต์ให้เปลี่ยนไดเรกทอรีทำงานเป็นพา ธ ในอาร์กิวเมนต์แรก

  2. จับคู่รายการทั้งหมดของไดเรกทอรีการทำงานปัจจุบันและดูพวกเขา สำหรับแต่ละรายการที่เพิ่มขึ้นเคาน์เตอร์และพิมพ์ค่าของมันพร้อมกับชื่อของรายการ ^Nสายตัวละครแบ่งในชื่อของรายการที่จะถูกแทนที่ด้วย

  3. ไพพ์เอาต์พุตผ่านcat -vtเพื่อจัดการกับชื่อไฟล์ที่มีอักขระที่ไม่สามารถพิมพ์ได้ซึ่งเทอร์มินัลอาจตีความว่าเป็นอักขระควบคุม

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