การทำซ้ำในแต่ละบรรทัดของเอาต์พุต ls -l


120

ฉันต้องการทำซ้ำในแต่ละบรรทัดในผลลัพธ์ของ: ls -l /some/dir/*

ตอนนี้ฉันกำลังพยายาม: for x in $(ls -l $1); do echo $x; done

อย่างไรก็ตามสิ่งนี้จะวนซ้ำในแต่ละองค์ประกอบในบรรทัดแยกกันดังนั้นฉันจึงได้รับ:

-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1

-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2

แต่ฉันต้องการทำซ้ำในแต่ละบรรทัดโดยรวม ฉันจะทำอย่างไร?


1
อ้างอิงตัวแปร (และเอาต์พุตคำสั่ง) เสมอเว้นแต่คุณจะมีเหตุผลเฉพาะที่จะไม่ทำ
Glenn Jackman

คำตอบ:


247

ตั้งค่า IFS เป็น newline ดังนี้:

IFS='
'
for x in `ls -l $1`; do echo $x; done

ใส่ sub-shell ไว้รอบ ๆ ถ้าคุณไม่ต้องการตั้งค่า IFS อย่างถาวร:

(IFS='
'
for x in `ls -l $1`; do echo $x; done)

หรือใช้ในขณะที่ | อ่านแทน:

ls -l $1 | while read x; do echo $x; done

อีกหนึ่งตัวเลือกซึ่งรัน while / read ที่ระดับเชลล์เดียวกัน:

while read x; do echo $x; done << EOF
$(ls -l $1)
EOF

12
ระวังเมื่อไปป์ในขณะที่ while จะทำงานใน subshell ซึ่งหมายความว่าไม่สามารถเปลี่ยนตัวแปรในกระบวนการหลักได้
Reorx

1
$ 1 กำลังทำอะไรอยู่ที่นี่? ฉันต้องใช้สิ่งนี้ในสคริปต์ที่ฉันเขียนที่ยอมรับข้อโต้แย้ง $ 1 กำลังทำให้สิ่งต่างๆหมดไป ฉันจะใส่อะไรแทน $ 1 เพื่อให้ได้เอฟเฟกต์เดียวกัน ฉันต้องการใช้วิธีที่สอง
noob-in-need

@ noob-in-need แทนที่ด้วยไดเร็กทอรีที่คุณต้องการแสดงรายการ
vpzomtrrfrt

1
คุณอาจต้องการทำread -rหรือมิฉะนั้น bash จะดึงแบ็กสแลชที่ไม่ใช้ Escape ออกจากข้อมูล
Brian Gordon

6

ขึ้นอยู่กับว่าคุณต้องการทำอะไรกับแต่ละบรรทัด awk เป็นยูทิลิตี้ที่มีประโยชน์สำหรับการประมวลผลประเภทนี้ ตัวอย่าง:

 ls -l | awk '{print $9, $5}'

.. บนระบบของฉันพิมพ์ชื่อและขนาดของแต่ละรายการในไดเร็กทอรี


3

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

for x in * ; do echo `ls -ld $x` ; done

3

คุณยังสามารถลองใช้findคำสั่ง หากคุณต้องการเฉพาะไฟล์ในไดเร็กทอรีปัจจุบัน:

find . -d 1 -prune -ls

เรียกใช้คำสั่งกับแต่ละคำสั่งหรือไม่

find . -d 1 -prune -exec echo {} \;

นับบรรทัด แต่ในไฟล์เท่านั้น?

find . -d 1 -prune -type f -exec wc -l {} \;


พบว่าเสีย Ioften ได้รับข้อความแสดงข้อผิดพลาดที่แปลกประหลาด ต้องการให้ฉันช่วยเมื่อบรรทัดคำสั่งถูกต้องสมบูรณ์และดูเหมือนว่าเมื่อเริ่มทำสิ่งนี้แล้วจะไม่หยุดจนกว่าจะรีบูตครั้งต่อไป MAYBE บางครั้งดูเหมือนสุ่มในลักษณะที่เกี่ยวข้องกับข้อผิดพลาด ไม่แน่ใจว่าฉันจะรายงานข้อบกพร่องได้อย่างไร
Jim Michaels


-1

เหตุใดจึงไม่มีใครแนะนำเพียงแค่ใช้ตัวเลือกที่กำจัดส่วนที่เขาไม่ต้องการดำเนินการ

ใน Debian สมัยใหม่คุณจะได้รับไฟล์ด้วย:

ls --format=single-column 

ยิ่งไปกว่านั้นคุณไม่ต้องสนใจว่าคุณกำลังเรียกใช้ไดเรกทอรีใดหากคุณใช้ไดเรกทอรีแบบเต็ม:

ls --format=single-column /root/dir/starting/point/to/target/dir/

คำสั่งสุดท้ายนี้ฉันใช้ข้างต้นและได้ผลลัพธ์ต่อไปนี้:

bot@dev:~/downloaded/Daily# ls --format=single-column /home/bot/downloaded/Daily/*.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141119_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141120_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141121_IENT1.txt.gz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.