คำสั่ง Linux และทักษะเชลล์
find: การค้นหา Linux ที่ทำทุกอย่าง
find เป็นคำสั่งที่อันตรายที่สุดบนเซิร์ฟเวอร์ที่ใช้งานจริง และนั่นคือเหตุผลที่สมควรได้รับความเชี่ยวชาญ โดยระบุ กรอง และดำเนินการในนิพจน์เดียว และเหตุการณ์ '/var here be dragons' แบบคลาสสิกทุกเหตุการณ์จะย้อนกลับไปดูตัวอย่างที่มีคนข้ามไป นิสัยเป็นแบบกลไก: เดินด้วย -print หรือ -ls ก่อน แบทช์ด้วย -exec ... + ไปป์ผ่าน -print0 ลงใน xargs -0 และถือว่า -delete เป็นการตัดสินใจผ่านครั้งที่สอง ไม่ใช่แบบร่างครั้งแรก
ประเด็นสำคัญ
- กรองข้อมูลเมตา ไม่ใช่ชื่อเพียงอย่างเดียว: -type f, -mtime +30, -size +100M และ -perm -o+w ค้นหาไฟล์แปลก ๆ ที่กฎการตั้งชื่อและรายงานอายุขาดหายไป
- ดูตัวอย่างการค้นหาแบบทำลายล้างทุกครั้ง: ค้นหา /var/www/uploads -name 'core.*' -ls ก่อน สลับ -ls สำหรับ -delete หลังจากที่คุณอ่านรายการจริงแล้วเท่านั้น การแสดงตัวอย่างเป็นการตรวจสอบความปลอดภัย ไม่ใช่ข้อเสนอแนะ
- -exec cmd {} + แบทช์ไฟล์เป็นการเรียกใช้เพียงไม่กี่ครั้งและเอาชนะ \; ก่อตัวบนต้นไม้ใหญ่ ไวยากรณ์เดียวกันให้พลัง 'rm ทุกไฟล์ที่ตรงกันในกระบวนการเดียว' โดยไม่มีข้อผิดพลาดรายการอาร์กิวเมนต์ยาวเกินไป
- เอาต์พุตที่ไม่ปลอดภัยโดยค่าเริ่มต้น: find . -name '*.old' -print0 | xargs -0 rm -v; ไปป์ธรรมดาใน xargs เป็นรูปแบบการสูญเสียข้อมูลที่ทราบในวันที่ชื่อไฟล์มีช่องว่าง
- -xdev และ -maxledge เดินอย่างซื่อสัตย์: พวกเขาหยุดการค้นหาจากการติดตามในการเมานต์และสแน็ปช็อต ซึ่งช่วยเหลือทั้งรันไทม์และสมมติฐานของคุณเกี่ยวกับ 'ไดเร็กทอรีนี้'
- กรอบเวลาจะแม่นยำหากถามอย่างแม่นยำ: -mmin -1440 สำหรับ 24 ชั่วโมงที่ผ่านมา, -newermt '2026-01-01' สำหรับตั้งแต่วันที่ และจำไว้ว่า -xtime หมายถึง 'ในช่วง 24 ชั่วโมงที่ผ่านมาเต็ม' ก่อนที่จะเสนอราคาในตั๋ว
- ตัดอย่างจงใจ: ค้นหา . -path '*/node_modules' -prune -o -name '*.js' -print ข้ามไดเร็กทอรีเดียวที่มีน้ำหนักเกินส่วนที่เหลือของแผนผังในขนาดและเวลา
- คาดว่าจะออกไม่เป็นศูนย์ในไดเร็กทอรีที่อ่านไม่ได้ บรรทัด stderr เช่น 'Permission rejected' จะถูกข้ามไฟล์ ไม่ใช่ข้อมูล ดังนั้นสคริปต์จะยอมรับสถานะการออกของ find หรือตรวจสอบอย่างชัดเจนแทนที่จะถือว่ามีการเดินที่สะอาด
บันทึกจากหน้างาน
เรื่องราว find -delete ที่แย่ที่สุดของเราเริ่มต้นด้วยรูปแบบ -name ที่ไม่มีเครื่องหมายคำพูด ซึ่งเชลล์ตัวที่สองขยายออกเป็นสามคำตั้งแต่ต้นทางของ find กฎตั้งแต่นั้นง่ายมาก: - พิมพ์ก่อน เสนอราคาเสมอ และ -delete จะไม่ดำเนินการในคำสั่งในครั้งแรกที่รัน
คำถามที่พบบ่อย
การค้นหาไฟล์ของฉันพบแล้ว แต่คำสั่งดาวน์สตรีมไม่ได้ทำอะไรเลย ทำไม
การอ้างอิงหรือการป้อนข้อมูลว่างเปล่าเกือบทุกครั้ง: รูปแบบถูกขยายโดยเชลล์ก่อนที่จะ find เห็นมัน หรือ xargs ไม่ได้รับอะไรเลย รูปแบบเครื่องหมายคำพูด และจับคู่ -print0 กับ xargs -0 ทุกครั้ง
-delete หรือ rm หลังจากค้นหา?
-การลบทำได้โดยตรง รวดเร็ว และไม่ยอมให้อภัย ไม่สามารถผสมกับ -exec ในนิพจน์เดียวกันได้ รันการจับคู่ -print ก่อนแล้วอ่าน นั่นคือวินัยทั้งหมด
เหตุใดจึงพบข้อผิดพลาดในการอนุญาตการพิมพ์ในไดเร็กทอรีระบบ
ส่วนประกอบที่คุณไม่สามารถอ่านข้อผิดพลาดในการพิมพ์ไปยัง stderr และทำให้การค้นหาทางออกไม่เป็นศูนย์ กรองด้วย 2>/dev/null เพื่อความสะดวกสบายในการโต้ตอบ และอย่าตีความข้อผิดพลาดเหล่านั้นว่าไม่มีไฟล์
ความแตกต่างระหว่าง -mtime และ -ctime อีกครั้ง?
-mtime คือการเปลี่ยนแปลงเนื้อหา -ctime คือการเปลี่ยนแปลงข้อมูลเมตา (สิทธิ์ การเปลี่ยนชื่อ จำนวนฮาร์ดลิงก์) chown หรือการเคลื่อนไหวกระแทก ctime โดยไม่ต้องแตะ mtime ซึ่งทำให้สับสนกับรายงานหนึ่งในสี่
Kinetikatech ช่วยเรื่อง คำสั่ง linux และทักษะเชลล์ ได้อย่างไร
เราเคยรับเรื่องแบบนี้มาเป็นร้อยครั้ง: คำสั่งและพฤติกรรมการเขียนสคริปต์ที่ตัดสินใจว่าผู้ดูแลระบบจะใช้งานเซิร์ฟเวอร์หรือต่อสู้กับเซิร์ฟเวอร์: ค้นหา แปลง ถ่ายโอน และดูแลข้อความและกระบวนการด้วยเครื่องมือที่อยู่ในทุกการติดตั้งฐาน กับ ความปลอดภัยเซิร์ฟเวอร์ Linuxและการจัดการเซิร์ฟเวอร์ คุณได้วงจรครบ ตั้งแต่เราประเมิน ลงมือทำ เฝ้าดูตลอดเวลา และรับเรื่องภายใน 30 นาทีเมื่อจำเป็น