ต้องการคำสั่งเพื่อเรียกใช้งานเฉพาะในกรณีที่จำนวนไฟล์ในไดเรกทอรีมากกว่า 1


1

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


คุณลองทำอะไร วางสคริปต์ปัจจุบันของคุณในคำถามเพื่อขอคำตอบที่ดีกว่า!
Ozair Kafray

สคริปต์มีขนาดใหญ่เกินไปที่จะใส่ลงในกล่องนี้ ฉันยังไม่ได้ลองอะไรเลยตั้งแต่ยังไม่รู้ว่าจะทำอย่างไร
jlacroix82

1
@ jlacroix82: คุณสามารถวางสคริปต์ในpastebinและวางลิงค์ได้ที่นี่
fmanco

ที่นี่มีอยู่ใน Pastebin: pastebin.com/4SGFHzVG โปรดทราบว่าฉันมีความละเอียดอ่อนมากเกี่ยวกับสคริปต์ฉันไม่ต้องการให้มีการเปลี่ยนแปลงใด ๆ นอกเหนือจากฟังก์ชั่นเพิ่มเติมที่ฉันขอ ฉันใส่ความคิดเห็นที่ฉันต้องการให้มันตรวจสอบว่ามีมากกว่าหนึ่งไฟล์ก่อนที่จะทำหรือไม่
jlacroix82

คำตอบ:


3

สิ่งที่ต้องการ

[ "$(ls -b | wc -l)" -gt 1 ] && { ... your statements ... }

มีวิธีใดบ้างที่จะใช้กับข้อความสั่ง if?
jlacroix82

นั่นคือ (ซ่อน / ตัวย่อ) ถ้า .. จากนั้นคำสั่ง เต็มความยาวก็จะอ่านif [ "$(ls -b | wc -l)" -gt 1 ]; then ... your statements ...; fi
Izzy

คำสั่งยังคงรันอยู่ว่ามีไฟล์มากกว่า 1 ไฟล์ในไดเรกทอรีหรือไม่ ฉันควรเพิ่ม -gt 1 เป็น -gt 2 หรือไม่
jlacroix82

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

ไม่มีไดเรกทอรีย่อยเลยเว้นแต่ว่ามันจะนับ ..
jlacroix82

0

ฉันต้องการใช้สิ่งนี้:

shopt -s nullglob
files=($dir/*) # $dir was declared earlier if you look at my script
if (( "${#files[@]}" >= 2 ));
     <statements>
fi
shopt -u nullglob

สาเหตุที่ไม่มีวิธีแก้ไขปัญหาใด ๆ ที่โพสต์ที่นี่เป็นเพราะต่อไปนี้ สคริปต์กำลังดำเนินการคำสั่งกับไดเรกทอรีไม่ใช่ CD'ing IN ไปยังไดเรกทอรี โดยบอกว่าโฟลเดอร์ใดที่ฉันทำงานด้วย ($ dir) จะได้คำใบ้และทำงานตามที่คาดไว้


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

0

ฉันจะใช้สิ่งที่ชอบ:

    dir=.
    nf=`find . -maxdepth 1 -type f | wc -l`

    if [ "$nf" -gt "1" ] ; then
            <do something here>
    fi

วิธีการนี้จะนับเฉพาะfilesในไดเรกทอรีที่ชี้dirและละทิ้งไดเรกทอรีย่อยที่เป็นไปได้

อย่าลืมที่จะเปลี่ยนแปลงdirตามความต้องการของคุณ


เพิ่งลองและ <ทำอะไรที่นี่> จะไม่ทำงานแม้ว่าจะมีไฟล์อยู่ในไดเรกทอรี
jlacroix82

คำสั่ง [ทดสอบ] อาจไม่ถูกต้อง: มันใช้สตริง (ในเครื่องหมายคำพูด) แต่เป็นการเปรียบเทียบตัวเลข (-gt) ลองแทนที่ส่วนนั้นด้วย[ $nf -gt 1 ](สำหรับการเปรียบเทียบตัวเลข) [ "$nf" != "0" -a "$nf" != "1" ]ถ้าคุณต้องการที่จะทำอย่างนั้นกับสตริงมันควรจะเป็น ยิ่งกว่านั้นคุณสามารถ (เพื่อวัตถุประสงค์ในการทดสอบ) ส่งออกค่าที่เก็บไว้ใน $ nf ก่อนบรรทัดที่ขึ้นต้นด้วย "if"
Izzy

@ อิซซี่: มันผิด ตัวเปรียบเทียบทำงานร่วมกับสตริง
fmanco

@ jlacroix82: ได้โปรด ตรวจสอบให้แน่ใจว่าไดเรกทอรีปัจจุบันเป็นสิ่งที่คุณต้องการ อย่าลืมว่าfindกำลังค้นหาไฟล์ในไดเรกทอรีปัจจุบัน ถ้าคุณต้องการคุณสามารถเปลี่ยนไปfind . find <directory>นอกจากนี้คุณสามารถใส่คำสั่งpwdในสคริปต์ของคุณเพื่อทราบว่าไดเรกทอรีปัจจุบันของคุณ สคริปต์ได้รับการทดสอบและใช้งานได้
fmanco

@criziot: มันอาจทำงาน (เรียงตามตัวอักษรและตัวเลขใด ๆ "จำนวนสตริง" ที่มีขนาดใหญ่กว่า 1 เริ่มต้นด้วยตัวเลข 1 หรือสูงกว่า) แต่ a) รูปแบบไม่ดีและ b) คุณไม่เคยรู้เกี่ยวกับการใช้งานว่า "สตริง -gt string" ได้รับการแปลงอย่างเงียบ ๆ man page ของtestอเมริกาอย่างชัดเจน: INTEGER1 -gt INTEGER2: INTEGER1 is greater than INTEGER2. ไม่มีอะไรเกี่ยวกับสตริงด้วย "-gt" แต่เราไม่เถียง - ตราบใดที่มันใช้ได้ผล)
อิซซี่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.