วิธีการ ls โดยไม่ต้องเรียกซ้ำ


19

ฉันพยายาม ls บางไฟล์ที่มีรูปแบบในไดเรกทอรี ฉันแค่ต้องการสแกนระดับแรกไม่ใช่เรียกซ้ำ

สคริปต์ของฉัน:

for i in $(ls $INCOMINGDIR/*$BUSSINESSDATE*)
do
  echo $i;
done

คำสั่งข้างต้นสแกนซ้ำ จะทำให้มันสแกนไดเรกทอรีระดับแรกเท่านั้นได้อย่างไร


printf %s\\n "$INCOMINGDIR/"*"$BUSINESSDATE"*
mikeserv

คำตอบ:


39

lsอย่าแยก นอกจากนี้ยังไม่ได้ใช้ ALL_CAPS_VARS

for i in "$incoming_dir"/*"$business_date"*; do

แบบโต้ตอบlsมี-dตัวเลือกที่ป้องกันไม่ให้ลงไปในไดเรกทอรีย่อย:

ls -d $INCOMINGDIR/*$BUSSINESSDATE*

ขอบคุณสำหรับข้อมูลฉันจะเริ่มสร้างไฟล์ด้วยบรรทัดใหม่ในชื่อเพื่อรบกวน sysadmins ตอนนี้
Petah

นั่นคือเหตุผลที่ดูแลระบบสมาร์ท / "${i}"ใช้โปรแกรมเมอร์ คุณไม่มีทางรู้ว่าสิ่งที่อาจจะiมา
Ricky Beam

@Petah: หรือคนที่มีเจตนาไม่ดีสามารถสร้างไฟล์ชื่อmy_file.doc[newline]another_persons_file.docและหวังว่าสคริปต์บางอย่างอาจพยายามที่จะ "rm" สิ่งที่เห็นเป็น 2 ชื่อไฟล์ ... ลิงก์ของ Glenn นั้นต้องอ่าน (บน mywiki.wooledge.org ทุกคนควรอ่าน คำถามที่พบบ่อยทั้งหมดและหน้าข้อผิดพลาด)
Olivier Dulac

1
เย็น. ฉันไม่รู้ตัวเลือก -d!
dokaspar

ที่ดี! มันใช้งานได้กับสิ่งที่ง่ายกว่าเช่นกัน เช่นรายการไฟล์ dot-prefixed ทั้งหมด:ls -d .*
Wassadamo

8

ไม่มีเหตุผลใดที่คำสั่งนี้ควรจะเรียกซ้ำ แต่ถ้า$INCOMINGDIR/*$BUSSINESSDATE*ตรงกับไดเรกทอรีเนื้อหาของไดเรกทอรีนี้จะแสดงแทนไดเรกทอรีเอง แต่จะไม่มีการเรียกซ้ำเกินระดับนี้

ใช้คำสั่งนี้เพื่อหลีกเลี่ยงผลกระทบนั้น:

ls -d "$INCOMINGDIR/"*"$BUSSINESSDATE"*

for ... inคำสั่งที่มีlsเอาต์พุตมีความเสี่ยง

โดยทั่วไปfindดูเหมือนจะเป็นทางออกที่ดีกว่าหรือ

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