วนซ้ำผ่านไฟล์ที่ไม่รวมไดเรกทอรี


11

ฉันต้องการสคริปต์ของฉันเพื่อทำบางสิ่งบางอย่างกับทุกไฟล์ในไดเรกทอรีปัจจุบันยกเว้นไดเรกทอรีย่อยใด ๆ

ตัวอย่างเช่นในเส้นทางปัจจุบันมี 5 ไฟล์ แต่หนึ่งในนั้นคือโฟลเดอร์ (ไดเรกทอรีย่อย) สคริปต์ของฉันควรเปิดใช้งานคำสั่งที่กำหนดเป็นอาร์กิวเมนต์เมื่อเรียกใช้สคริปต์ดังกล่าว คือ "bash script wc -w" ควรให้จำนวนคำของแต่ละไฟล์ในไดเรกทอรีปัจจุบัน แต่ไม่ใช่โฟลเดอร์ใด ๆ เพื่อให้ผลลัพธ์ไม่เคยมีบรรทัด "/ sub / dir: เป็นไดเรกทอรี"

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

#!/bin/bash
dir=`pwd`
for file in $dir/*
do
    $* $file
done

ฉันแค่ต้องแยกไดเรกทอรีสำหรับวง แต่ฉันไม่รู้วิธี

คำตอบ:


11
#!/bin/bash -

for file in "$dir"/*
do
  if [ ! -d "$file" ]; then
      "$@" "$file"
  fi
done

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

ทางเลือก (จากความคิดเห็น) ตรวจสอบเฉพาะไฟล์:

for file in "$dir"/*
do
  if [ -f "$file" ]; then
      "$@" "$file"
  fi
done

@roaima ความคิดที่ดี!
laktak

2
if [ -f "$file" ]; then ...ดีกว่าที่จะใช้ ไม่ใช่ไดเร็กตอรี่ที่จะส่งคืนไฟล์ธรรมดาไม่เพียง แต่ซ็อกเก็ตและ symlink ด้วย
JRFerguson

@JRFerguson ตามคำถามของ OP ฉันจะบอกว่าการรวมซ็อกเก็ตและท่อจะเป็นความคิดที่ไม่ดีจริงๆ สำหรับ symlink เหล่านั้นจะถูกรวมเข้ากับ implicitly อยู่! -dแล้ว
roaima

ฉันใช้ [-f $ file] ในสคริปต์สุดท้ายของฉัน สังเกตการขาดเครื่องหมายคำพูดในเงื่อนไข if เกือบทุกที่ที่ฉันดูมีเครื่องหมายอัญประกาศประมาณ $ file แต่ฉันต้องลบมันเพื่อให้สคริปต์ทำงานได้
Tõnis Piip

3

นี่เป็นอีกทางเลือกหนึ่งในการใช้ for for loop หากสิ่งที่คุณต้องทำนั้นง่าย (และไม่เกี่ยวข้องกับการตั้งค่าตัวแปรในเชลล์หลัก & c)

คุณสามารถใช้findกับ-execและใช้-maxdepth 1เพื่อหลีกเลี่ยงการเรียกซ้ำในไดเรกทอรีย่อย

[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;

[ -n "$1" ]จะมีการหลีกเลี่ยงการรันไฟล์ในไดเรกทอรีทั้งหมดเมื่อสคริปต์ไม่ผ่านข้อโต้แย้งใด ๆ


2

ใน zsh คุณสามารถใช้ตัวระบุแบบกลมเพื่อ จำกัด การจับคู่สัญลักษณ์ตามประเภทไฟล์ ตัวอย่างเช่นการเพิ่ม(.)หลังจากรูปแบบจะ จำกัด เฉพาะไฟล์ปกติ

wc -w *(.)

เพื่อรับมือกับชื่อไฟล์ที่เริ่มต้นด้วย-หรือ.ใช้หรือwc -c -- *(.N) หากคุณต้องการที่จะรวมถึงการเชื่อมโยงสัญลักษณ์ไปยังไฟล์ปกติเช่นกันทำให้wc -c ./*(.N)*(-.)

เปลือกหอยอื่น ๆ ทั่วไปไม่มีคุณสมบัติดังกล่าวดังนั้นคุณจำเป็นต้องใช้กลไกที่แตกต่างกันบางอย่างสำหรับการกรองโดยไฟล์เช่นการทดสอบประเภทไฟล์ในวงfindหรือ


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