Bash script เพื่อนับจำนวนไฟล์


11

ฉันมีสคริปต์และฉันต้องการที่จะแสดงข้อความที่แตกต่างกันถ้าไฟล์ที่มีอยู่หรือไม่ ฉันมีสคริปต์เช่น:

count=ls /import/*.zip | wc -l

echo "Number of files: " $count
if [ "$count" > "0" ]; then
    echo "Import $count files"
else
    echo "**** No files found ****"
fi

อย่างไรก็ตามหากไม่มีไฟล์อยู่แสดงว่าเป็นการแสดงNo such file or directoryแทน 0 ไฟล์ มีไดเรกทอรีอยู่ใน/import/ไดเรกทอรีดังนั้นฉันไม่สามารถทำlsคำสั่งได้เพราะจะส่งคืนค่าที่มากกว่า 0

ฉันจะนับจำนวนไฟล์ของส่วนขยายเฉพาะ (.zip, .gz ฯลฯ ) และใช้ค่านั้นในสคริปต์ทุบตีเพื่อแสดงจำนวนไฟล์จากนั้นใช้ในคำสั่ง if เพื่อแสดงข้อความที่แตกต่างกันอย่างไร

คำตอบ:


15

count=$(find /import -maxdepth 1 -name '*.zip' | wc -l)


1
ฉันเพิ่ม -maxdepth 1 เพื่อนับเฉพาะไฟล์ในไดเรกทอรีปัจจุบัน
Wallace Sean

1
คุณอาจต้องการเสนอราคา '* .zip' ในกรณีที่มีไฟล์. zip อยู่ในไดเรกทอรีปัจจุบันเมื่อมีการเรียกใช้งานในกรณีนี้เชลล์จะขยาย * .zip ให้กับคุณในขณะที่คุณต้องการให้มันผ่านเพื่อค้นหา (1)
ฟิล P

4

ลองกับสิ่งนี้:

count=$(find /import/ -maxdepth 1 -type f -name '*.zip' | wc -l)
...
if [ $count -gt 0 ] ; then
  ...
else
  ...
fi

แนวคิดคือการซ่อนข้อผิดพลาด "ไม่มีไฟล์ดังกล่าว" ที่พิมพ์ไปยัง STDERR โดยส่งไปยังบิตบูทและใช้ฟังก์ชันทดสอบที่เหมาะสมสำหรับการเปรียบเทียบตัวเลข ( -gtย่อมาจาก "มากกว่า". นอกจากนี้ยังมี-eq, -lt, -geฯลฯ )


คุณสามารถทำได้เช่นกันcount=$(find /import -type f -name "*.zip" | wc -l)
slillibri

แน่นอน แต่นั่นมีความหมายที่แตกต่างกันls /import/*.zipหากมีไดเรกทอรีย่อย
Mat

ฉันตั้งค่า maxdepth เพื่อหลีกเลี่ยงการนับไฟล์ในไดเรกทอรีย่อยและอัพเดทสคริปต์เพื่อใช้ -gt ขอบคุณสำหรับความช่วยเหลือ
Wallace Sean

สิ่งนี้ล้มเหลวหากมีไฟล์มากเกินไปในไดเรกทอรีให้พอดีกับ argv สำหรับการเรียกใช้ ls
ฟิล P

อ่าใช่มั้ย ถูกต้องด้วยfindตัวแปร
Mat

0

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

count=$(ls /import/*.zip 2>/dev/null| wc -l)

2>/dev/nullเปลี่ยนเส้นทาง stderr ไปที่/dev/null, ระงับข้อความข้อผิดพลาด

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