ฉันจะสะท้อนเอาต์พุต 1 คอลัมน์จากคำสั่ง ls ได้อย่างไร


54

ให้พูดเมื่อฉันทำคำสั่ง ls ผลลัพธ์คือ:

file1 file2 file3 file4

เป็นไปได้หรือไม่ที่จะแสดงเฉพาะคอลัมน์ของเอาต์พุตในกรณีนี้ file2? ฉันได้ลองทำสิ่งต่อไปนี้โดยไม่ประสบความสำเร็จ:

echo ls | $2

โดยพื้นฐานทั้งหมดที่ฉันต้องการทำคือ echo เฉพาะคอลัมน์ที่สองในกรณีนี้ฉันต้องการ echo:

file2

2
สถานการณ์ที่คุณต้องการคอลัมน์ของlsผลลัพธ์คืออะไร
michas

11
ตามกฎทั่วไปคุณควรไม่เคยแยก LS มีเกือบจะมีเสมอวิธีที่ดีกว่าในการได้รับข้อมูลที่คุณต้องการ
terdon

ฉันจะไม่ทำกับคนแปลกหน้า: P (ขอโทษด้วยที่ฉันชอบวลีนั้น) จำนวนคอลัมน์ขึ้นอยู่กับชื่อไฟล์และโฟลเดอร์ดังนั้นคอลัมน์ที่ 2 อาจเป็นคอลัมน์ที่คุณต้องการหรืออาจไม่หรืออาจเป็นหนึ่งlsและ หลังจากสร้างไฟล์ / โฟลเดอร์บางไฟล์แล้วอาจไม่เป็นสิ่งที่คุณต้องการอีกต่อไป terdon ชี้ให้เห็นว่ามีวิธีที่ดีกว่าในการได้รับสิ่งที่คุณต้องการ
YoMismo

คำตอบ:


81

คำสั่งต่อไปนี้จะจัดรูปแบบ ls เป็นหนึ่งคอลัมน์

ls -1 /directory

2
แต่มันไม่ได้ให้คุณแค่หนึ่งคอลัมน์ที่ OP สนใจ
Anthon

1
เพื่อให้ถูกต้อง: ls -1 /directory | head -2 | tail -1หรือls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWubbufetowicz ls | sed -n '1p;q'ดูเรียบง่ายขึ้น
Fiximan

3
คำตอบที่ฉันกำลังมองหา แต่ไม่ใช่สำหรับคำถามของ OP
Michael Lang

36

คุณกำลังมองหาสิ่งนี้:

ls -C | awk '{ print $2 }'

อย่างไรก็ตามสมมติว่าคุณกำลังจะลองใช้ชื่อไฟล์นี้ในภายหลังอย่าทำเช่นนี้เพราะมันจะแตกในชื่อไฟล์ที่มีช่องว่าง ให้วางไฟล์ลงในอาเรย์แทนและหาอันที่สองซึ่งหลีกเลี่ยงการแยกวิเคราะห์เลย:

files=(*)
printf '%s\n' "${files[1]}"

LC_COLLATEเพื่อที่คุณจะได้รับกลับไฟล์ขึ้นอยู่กับมูลค่าของ คุณอาจต้องการตั้งค่าLC_COLLATE=Cก่อนหากคุณต้องการเรียงลำดับ "มาตรฐาน" ในทุกกรณี


โปรดทราบว่าดัชนีอาร์เรย์จะเริ่มต้นที่1เชลล์ที่มีเหตุผล (zsh, yash, fish, csh, tcsh, rc, es ... ) และที่เป็น0ksh และ bash สำหรับวิธีแก้ปัญหาแบบพกพาไปยังเชลล์ที่เหมือน Bourne ทั้งหมดคุณสามารถใช้: set -- *; printf '%s\n' "$2"แทน
Stéphane Chazelas

@ StéphaneChazelasอย่างน้อยที่สุดสำหรับคำถามนี้แท็กมี "bash" ดังนั้นคำตอบนี้เฉพาะกับเชลล์นั้น
Chris Down

ls -C | awk '{พิมพ์ $ 1} ดูเหมือนจะให้ผลลัพธ์เหมือนกัน ... ทำไม $ 2
boctulus

7

คุณจะต้องเพิ่ม-Cเป็นlsใช้โหมดคอลัมน์เดียวเมื่อเอาท์พุทไม่ได้เป็นขั้ว awkจากนั้นพิมพ์คอลัมน์ที่สอง:

ls -C | awk '{print $2}'

2

ฉันคิดว่าคุณกำลังมองหา

ls -1

จะไม่แสดงการอนุญาตเจ้าของกลุ่มวันที่ขนาด ... แต่ชื่อไฟล์ธรรมดาในคอลัมน์เดียว


1
คำตอบนี้ไม่เพียง แต่จะผิด แต่มันได้รับมาก่อน
สกอตต์

แม้ว่าฉันจะรู้ว่านี่เป็นสิ่งที่ผิดสำหรับคำถามดั้งเดิม แต่เป็นสิ่งที่ฉันกำลังมองหา ดังนั้นขอบคุณ
AntumDeluge

0

วิธีเดียวที่ใช้ได้ผลสำหรับฉันคือการเพิ่ม "-all" นั่นคือ:

ls -C -all | awk '{ print $1 }'

เพราะ-allเพิ่มคอลัมน์เพิ่มเติมเช่นผู้ใช้การอนุญาต ฯลฯ


0

ดังที่ได้กล่าวไปแล้ว - การใช้คอลัมน์สำหรับการแยกวิเคราะห์lsผลลัพธ์ไม่ได้มีความสมบูรณ์มากนักเนื่องจากlsแบ่งบรรทัดตามความยาวชื่อไฟล์และความกว้างของเทอร์มินัล มันมักจะน่าสนใจแม้ว่าจะแสดงคอลัมน์เดียวของรายการองค์ประกอบ คุณสามารถทำได้โดยใช้คำสั่ง cut:

echo file1 file2 file3 file4 | cut -d" "  -f2

จะแสดง

file2

โปรดทราบว่า-dให้คุณเลือกตัวคั่นคอลัมน์ดังนั้นเช่น

cur -d, -f2

คุณสามารถแสดงคอลัมน์ที่สองของรายการที่คั่นด้วยเครื่องหมายจุลภาค


0

สมมติว่าคุณต้องการแสดงเฉพาะชื่อไฟล์ภายใต้พา ธ ปัจจุบันใช้คำสั่งด้านล่าง

คำสั่ง:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

นี่เป็นเรื่องยุ่งยากเพราะการแยกวิเคราะห์ls -Cขึ้นอยู่กับ:

  1. ความยาวชื่อไฟล์ (ซึ่งขึ้นอยู่กับรายการไฟล์ที่ระบุที่ส่งไปยังls -C)
  2. ความกว้างของอาคาร
  3. ความจริงที่ว่าls -Cเอาต์พุตเป็นแบบเรียงเป็นแนว แต่อาจถูกกำหนดค่าเป็นจำนวนช่องว่างที่แตกต่างกันเป็นตัวคั่นฟิลด์
  4. ความเป็นไปได้ของช่องว่างในชื่อไฟล์ (การแสดงผลนั้นขึ้นอยู่กับlsตัวเลือกการแสดงผลเฉพาะที่เลือก)

สำหรับตอนนี้ขอเริ่มต้นด้วยปัญหาที่เกิดขึ้นได้ง่ายขึ้น ( เช่นไม่ # 4 ข้างต้น) สมมติว่ามีช่องว่างในชื่อไฟล์ไม่มี หากต้องการพิมพ์คอลัมน์ # 2 วิธีนี้จะได้ผล:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

การยกเลิกที่:

  • COLUMNS=$COLUMNSรับประกันว่าความยาวของเสาที่ป้อน| ยังคงสอดคล้องกับจอแสดงผลเทอร์มินัลปัจจุบัน การเปลี่ยนค่านี้เป็นค่าที่กำหนดเองก็ใช้งานได้เช่นกันCOLUMNS=50หรือCOLUMNS=70 อาจทำให้เกิดls -Cการเรียงลำดับใหม่ตามความกว้างเหล่านั้น

    วิธีอื่นจะใช้-wสวิตช์เช่น :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trทำให้ตัวคั่นฟิลด์สอดคล้องกัน: แท็บเดียวระหว่างแต่ละคอลัมน์

  • cut ส่งออกคอลัมน์ที่ต้องการ


ช่องว่างระหว่างทางกำลังรอ ...
agc

-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

เปลี่ยนจำนวนตัวอักษร (54) ตามที่จำเป็นเพื่อให้คุณได้รับข้อมูลที่คุณต้องการเท่านั้น


2
เพื่อชี้แจงโดยใช้54-บอกให้ตัดกับตัวละครทุกตัวเริ่มต้นที่ตำแหน่ง 54; มันไม่ได้หยุดอยู่ที่ "มนุษย์ได้รับการยอมรับ" คอลัมน์
เจฟฟ์ Schaller

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