ค้นหาไฟล์ใน linux และแยกไดเรกทอรีเฉพาะ


14

ฉันมีหน้าตาแบบนี้:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

ฉันต้องการเพิ่มเพื่อยกเว้นไดเรกทอรีที่เรียกว่า "ทดสอบ" ในการค้นหา แต่ฉันไม่สามารถหาวิธีเพิ่ม "-type d" ได้ ฉันจะทำเช่นนั้นได้อย่างไร

ขอบคุณ!

คำตอบ:


22

คุณสามารถใช้-pathตัวเลือกในการค้นหาและรวมกับ-notผู้ประกอบการ

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

โปรดสังเกตสองสิ่ง

  • -path จะต้องมาเป็นอาร์กิวเมนต์แรก
  • รูปแบบตรงกับชื่อไฟล์ทั้งหมดดังนั้น-path testจะไม่ตรงกับสิ่งใดเลย

โดยวิธีการที่ฉันไม่แน่ใจว่าทำไมคุณใช้วงเล็บมันไม่ได้สร้างความแตกต่าง มันจะใช้สำหรับความสำคัญกว่าสำหรับการสร้างเช่น! \( -name '*bla*' -name '*foo*' \)(นั่นคือไม่พบสิ่งที่มีทั้งblaและfoo)

การปรับแต่งเพิ่มเติม: ไม่จำเป็นต้องใช้ bash loop คุณสามารถทำได้

find . ... -exec cat {} \; -exec echo \;

ที่ ... มีข้อโต้แย้งอื่น ๆ findที่จะ


2
find / -path ./test -prune -o ...

เปลี่ยนชื่อ./testให้เหมาะสมกับตำแหน่งของไดเรกทอรีทดสอบของคุณ


2
ในกรณีนี้อย่าลืมเพิ่มการกระทำที่พิมพ์ (เพราะ -print ไม่ใช่การกระทำเริ่มต้น) หลังจากตัวเลือก -o
บิล Zhao

1

คุณสามารถลอง grep เช่นนี้ (โฟลเดอร์ที่นี่มีชื่อว่า test_folder):

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

หรือถ้าการค้นหาของคุณส่งคืนพา ธ สัมพัทธ์:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

หรือถ้าคุณต้องการโฟลเดอร์ทั้งหมดที่มีชื่อเหมือนกัน แต่มีเส้นทางที่แตกต่างกัน

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

ขอแสดงความนับถืออย่างสูง,


1

เพื่อขยายสิ่งที่ฉันคิดว่า@CharlesClavadetscherเป็นไปได้ด้วยคำตอบของเขา หากคุณเว้นเส้นทางด้วย-not -path ... findจะดำเนินการต่อจากเส้นทาง การใช้-pruneจะหยุดไม่ให้น้อยไปหามากในเส้นทางที่ข้ามไปทำให้เร็วขึ้น ดังนั้นคุณสามารถทำสิ่งที่ชอบ

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

0

ฉันใช้ "not wholename" เมื่อฉันแค่ค้นหาไฟล์ -nameทดสอบชื่อไฟล์จริง แต่-wholenameทดสอบพา ธ เต็ม ดังนั้นการเพิ่มการเพิกเฉยสำหรับการทดสอบกับคำถามข้างต้น:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.