ฉันจะแสดงชื่อไฟล์หนึ่งชื่อต่อหนึ่งบรรทัดเอาต์พุตใน Linux ได้อย่างไร


229

ฉันใช้ls -aคำสั่งเพื่อรับชื่อไฟล์ในไดเรกทอรี แต่ผลลัพธ์อยู่ในบรรทัดเดียว

แบบนี้:

.  ..  .bash_history  .ssh  updater_error_log.txt

ฉันต้องการทางเลือกในตัวเพื่อรับชื่อไฟล์แต่ละไฟล์ในบรรทัดใหม่เช่นนี้

.  
..  
.bash_history  
.ssh  
updater_error_log.txt

3
ls มีวัตถุประสงค์เพื่อแสดงรายการสำหรับการบริโภคของมนุษย์ หากคุณใช้ ls เพื่อจุดประสงค์อื่น (เช่นพูดเพื่อรับรายการไฟล์ในสคริปต์เพื่อทำซ้ำ) คุณจะใช้เครื่องมือที่ผิดอย่างแน่นอนที่สุด
Juliano

2
@juliano - สคริปต์ python จะต้องใช้งานจริง ทำไมคุณถึงเรียกมันว่าเป็นเครื่องมือที่ผิด?
fixxxer

1
@fixxer ช่วงเวลาที่คุณไพพ์lsถึงไพ ธ อนlsจะส่งออกหนึ่งไฟล์ต่อบรรทัดตามที่ฉันอธิบายในคำตอบของฉัน
Peter G.

6
@fixxxer: ถ้าอย่างนั้นคุณก็ใช้มันผิด มันจัดรูปแบบรายการสำหรับการส่งออกในสถานีผู้ใช้ มันอาจแทนที่ตัวอักษรพิเศษในชื่อไฟล์มันอาจละเว้นตัวละครที่มีความหมายพิเศษ ฯลฯ ... ในคำอื่น ๆรูปแบบ ls รายการให้กับผู้ใช้ คุณต้องการชื่อไฟล์ที่ยังไม่ฟอร์แมต มีเหตุผลพิเศษอะไรบ้างที่คุณไม่ได้ใช้โมดูล 'glob' ของไพ ธ อน? docs.python.org/library/glob.html นอกจากนี้ยังมี 'fnmatch', 'dircache' และอื่น ๆ
Juliano

@fixxer คุณสร้างและlsส่งออกไปยังpythonบรรทัดเดียวใน python จริงหรือไม่?
Peter G.

คำตอบ:


430

ใช้-1ตัวเลือก (โปรดทราบว่านี่คือตัวเลข "หนึ่ง" ไม่ใช่ตัวพิมพ์เล็ก "L") เช่นนี้:

ls -1a

ครั้งแรก แต่ให้แน่ใจว่าคุณสนับสนุนls -1coreutils GNU (ติดตั้งบนระบบ Linux มาตรฐาน) และ Solaris ทำ; แต่ถ้าสงสัยใช้man lsหรือls --helpหรือตรวจสอบเอกสาร เช่น:

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

2
+1 ผมไม่ทราบว่าเกี่ยวกับ -1 (ใช่ -l (ell ไม่ได้เป็นหนึ่ง)) มันแสดงให้เห็นในมนุษย์หน้า แต่ฉันได้อ่านว่ามันเป็น ell ตลอดเวลา :)
slashmais

@slashmais - อาจุดดี - ง่ายต่อการเข้าใจผิด ฉันชี้แจงในคำตอบ
Bert F

1
@dty: สำหรับ GNU คุณจะได้รับเอกสารนี้ในls --helpผลลัพธ์ ... ติดตั้งเสมอ ;-)
Tony Delroy

3
ค้นหาใน Google linux ls one file per lineแล้วนี่คือบทความยอดนิยม ไม่อยากจะเชื่อเลยว่าคำตอบที่เลือกใช้คำฟุ่มเฟือยหรือคำตอบนี้มีคะแนนน้อยกว่าคำตอบที่ท่อแมว ls -1FTW
crantok

3
lsค่าเริ่มต้นของ-1พฤติกรรมเมื่อเอาท์พุทไม่ได้เชื่อมต่อกับขั้ว
codeforester

131

ใช่คุณสามารถสร้างlsชื่อไฟล์หนึ่งไฟล์ต่อบรรทัดได้อย่างง่ายดาย:

ls -a | cat

คำอธิบาย: คำสั่งจะlsตรวจจับว่าเอาต์พุตเป็นเทอร์มินัลหรือไฟล์หรือไพพ์และปรับตามนั้น

ดังนั้นถ้าคุณls -aไพพ์ถึงไพ ธ อนควรทำงานโดยไม่มีมาตรการพิเศษใด ๆ


2
ว้าวนี่มันช่างยอดเยี่ยม ข้อได้เปรียบเหนือคำตอบที่ได้รับการยอมรับ - อันนี้ใช้งานได้จริงบน Android / adb shell - ซึ่งlsเป็นรุ่นที่ถูกถอดออกบางรุ่นจึงไม่รองรับ-1
mkilmanas

คุณจะหลีกเลี่ยง.และและ.."ไฟล์" ที่แสดงในผลลัพธ์ได้อย่างไร
matanster

@matanster: มันขึ้นอยู่กับว่าคุณต้องการที่จะเห็นไฟล์ dot-all? หากไม่มีให้เลือกตัวเลือก -a
ปีเตอร์จี

29

Ls ถูกออกแบบมาเพื่อการบริโภคของมนุษย์และ คุณไม่ควรแยกเอาท์พุท

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

lsในหลามอย่างมีเหตุผลที่จะก่อให้เกิดไม่มี Python มีlsฟังก์ชันการทำงานทั้งหมดในตัว ใช้os.listdirเพื่อแสดงรายการเนื้อหาของไดเรกทอรีและos.statหรือosเพื่อรับข้อมูลเมตาของไฟล์ ฟังก์ชั่นอื่น ๆ ในosโมดูลมีแนวโน้มที่จะเกี่ยวข้องกับปัญหาของคุณเช่นกัน


หากคุณกำลังเข้าถึงไฟล์ระยะไกลผ่าน ssh วิธีที่มีประสิทธิภาพในการระบุชื่อไฟล์คือ sftp:

echo ls -1 | sftp remote-site:dir

พิมพ์ชื่อไฟล์หนึ่งชื่อต่อบรรทัดและแตกต่างจาก lsยูทิลิตีที่sftpไม่สามารถพิมพ์อักขระที่ไม่สามารถพิมพ์ได้ คุณจะยังคงไม่สามารถแสดงรายการไดเรกทอรีที่เชื่อถือได้ซึ่งชื่อไฟล์มีการขึ้นบรรทัดใหม่ แต่ทำได้ยาก (โปรดจำไว้ว่านี่เป็นปัญหาด้านความปลอดภัยที่อาจเกิดขึ้นไม่ใช่ปัญหาการใช้งาน)

ในไพ ธ อน (ระวังว่าเชลล์เมตาอักขระต้องอยู่ในหนีremote_dir):

command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")

สำหรับการโต้ตอบที่ซับซ้อนยิ่งขึ้นค้นหาโหมดแบตช์ของ sftp ในเอกสาร

ในบางระบบ (Linux, Mac OS X, อาจจะเป็น unices อื่น ๆ แต่ไม่ใช่ Windows) วิธีที่แตกต่างคือการติดตั้งระบบไฟล์ระยะไกลผ่าน ssh ด้วยsshfsแล้วทำงานในพื้นที่


ฉันเชื่อมต่อผ่าน SSH กับเครื่องระยะไกล ฉันไม่พบวิธีการใช้งานฟังก์ชั่นหลามอย่าง os.listdir บนเครื่องระยะไกลในบรรทัดเดียว ดังนั้นคำถามนี้ ฉันไม่ต้องการเขียนสคริปต์เพียงแค่แสดงไฟล์ มีวิธีอื่นในการแก้ไขปัญหานี้หรือไม่?
fixxxer

@fixxxer: ssh เปลี่ยนสถานการณ์มันเป็นสิ่งที่คุณควรพูดถึงในคำถามดั้งเดิมของคุณ! ฉันคิดว่า sftp เหมาะสมกับกรณีการใช้งานของคุณ
Gilles 'หยุดชั่วร้าย'

ฉันขอโทษสำหรับความสับสน มีวิธีที่ฉันสามารถแทรกรหัสผ่านใน "command_line" ด้วยหรือไม่
fixxxer

@fixxxer: ฉันไม่รู้ผู้เขียน ssh ขมวดคิ้วเกี่ยวกับรหัสผ่านที่เก็บไว้ในข้อความธรรมดาและมีแนวโน้มที่จะไม่ทำให้มันง่าย คุณควรตั้งค่าการรับรองความถูกต้องตามคีย์ (มีบทเรียนมากมายบนเว็บและคำถามเกี่ยวกับsuperuser.comเกี่ยวกับเรื่องนี้)
Gilles 'หยุดความชั่วร้าย'

11

คุณสามารถใช้ได้ ls -1

ls -l ยังจะทำงาน


คำตอบยอดนิยมได้กล่าวถึงสิ่งที่คุณพูดแล้ว นอกจากนี้คำถามที่ระบุว่าls -lไม่ควรใช้
DevX

2

ง่ายตราบใดที่ชื่อไฟล์ของคุณไม่รวมบรรทัดใหม่:

find . -maxdepth 1

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

find . -maxdepth 1 -print0

การพิมพ์ว่าบนเทอร์มินัลอาจแสดงเป็นหนึ่งบรรทัดเนื่องจากไบต์ว่างจะไม่ถูกพิมพ์ บางโปรแกรมอาจต้องตัวเลือกที่เฉพาะเจาะจงในการจัดการการป้อนข้อมูล null คั่นเช่น'ssort -zสคริปต์ของคุณในทำนองเดียวกันจะต้องบัญชีนี้

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