(ฉันสมมติว่า GNU find
ที่นี่)
ใช้เพียง
find filename
จะรวดเร็วเพราะมันจะกลับมาfilename
หรือชื่อภายในfilename
ถ้ามันเป็นไดเรกทอรีหรือข้อผิดพลาดหากชื่อนั้นไม่มีอยู่ในไดเรกทอรีปัจจุบัน มันเป็นการดำเนินการที่รวดเร็วมากคล้ายกับls filename
(แต่เรียกซ้ำถ้าfilename
เป็นไดเรกทอรี)
ในทางตรงกันข้าม,
find | grep filename
จะอนุญาตให้find
สร้างรายชื่อทั้งหมดจากไดเรกทอรีปัจจุบันและด้านล่างซึ่งgrep
จะกรอง เห็นได้ชัดว่านี่เป็นการทำงานที่ช้ากว่ามาก
ฉันสมมติว่าสิ่งที่ตั้งใจจริงคือ
find . -type f -name 'filename'
นี่จะมองหาfilename
เป็นชื่อของไฟล์ปกติที่ใดก็ได้ในไดเรกทอรีปัจจุบันหรือด้านล่าง
นี้จะเป็นอย่างรวดเร็ว (หรือปานด่วน) เป็นfind | grep filename
แต่grep
การแก้ปัญหาจะตรงfilename
กับเส้นทางแบบเต็มของแต่ละชื่อที่พบคล้ายกับสิ่งที่จะทำอย่างไรกับ-path '*filename*'
find
ความสับสนนั้นมาจากการเข้าใจผิดเกี่ยวกับวิธีการfind
ทำงาน
ยูทิลิตีใช้จำนวนเส้นทางและส่งคืนชื่อทั้งหมดที่อยู่ใต้เส้นทางเหล่านี้
จากนั้นคุณสามารถจำกัดชื่อที่ส่งคืนโดยใช้การทดสอบต่างๆที่อาจทำงานกับชื่อไฟล์พา ธ การประทับเวลาขนาดไฟล์ประเภทของไฟล์และอื่น ๆ
เมื่อคุณพูด
find a b c
คุณถามfind
ไปยังรายชื่อทุกคนอยู่ภายใต้สามเส้นทางa
, และb
c
หากสิ่งเหล่านี้เกิดขึ้นเป็นชื่อของไฟล์ปกติในไดเรกทอรีปัจจุบันสิ่งเหล่านี้จะถูกส่งคืน หากใด ๆ ของพวกเขาเกิดขึ้นเป็นชื่อของไดเรกทอรีแล้วมันจะถูกส่งกลับพร้อมกับชื่อเพิ่มเติมทั้งหมดภายในไดเรกทอรีนั้น
เมื่อฉันทำ
find . -type f -name 'filename'
สิ่งนี้จะสร้างรายชื่อทั้งหมดในไดเรกทอรีปัจจุบัน ( .
) และด้านล่าง จากนั้นก็จะ จำกัด ชื่อให้กับผู้ที่ไฟล์ปกติเช่นไม่ไดเรกทอรี ฯลฯ -type f
มี จากนั้นก็มีข้อ จำกัด ต่อไปชื่อที่ตรงกับการใช้filename
-name 'filename'
สตริงfilename
นั้นอาจเป็นรูปแบบชื่อไฟล์ที่กำลังวนรอบเช่น*.txt
(โปรดจำไว้ว่าให้พูด!)
ตัวอย่าง:
ดูเหมือนว่าต่อไปนี้จะ "ค้นหา" ไฟล์ที่เรียกว่า.profile
ในไดเรกทอรีบ้านของฉัน:
$ pwd
/home/kk
$ find .profile
.profile
แต่ในความเป็นจริงมันแค่คืนค่าชื่อทั้งหมดที่พา ธ.profile
(มีเพียงหนึ่งชื่อเท่านั้นและนั่นคือไฟล์นี้)
จากนั้นฉันcd
ขึ้นหนึ่งระดับแล้วลองอีกครั้ง:
$ cd ..
$ pwd
/home
$ find .profile
find: .profile: No such file or directory
คำสั่งในขณะนี้ไม่พบเส้นทางที่เรียกว่าfind
.profile
อย่างไรก็ตามถ้าฉันให้มันไปดูที่ไดเรกทอรีปัจจุบันและจากนั้นจำกัด ชื่อที่ส่งคืนไปเท่านั้น.profile
มันก็พบว่าจากที่นั่นเช่นกัน:
$ pwd
/home
$ find . -name '.profile'
./kk/.profile