อ่าน 5 นาที
ค้นหา (ยูนิก)
find เป็น คำสั่ง เชลล์ ที่ค้นหา ไฟล์ [ a ] ตามเกณฑ์การค้นหาและดำเนินการกับไฟล์ที่ตรงกัน เช่น การพิมพ์ เส้นทาง ระบบไฟล์ ไปยัง เอาต์พุตมาตรฐาน คำสั่ง นี้เริ่มต้นการค้นหาที่...
ค้นหา (ยูนิก)
| หา | |
|---|---|
| ผู้เขียนต้นฉบับ | ดิ๊ก ไฮท์ |
| นักพัฒนา | เอทีแอนด์ที เบลล์ แล็บโบราทอรีส์ |
| ระบบปฏิบัติการ | ยูนิก , ระบบคล้ายยูนิก , Plan 9 , IBM i |
| แพลตฟอร์ม | ข้ามแพลตฟอร์ม |
| พิมพ์ | สั่งการ |
findเป็นคำสั่งเชลล์ ที่ค้นหาไฟล์[ a ]ตามเกณฑ์การค้นหาและดำเนินการกับไฟล์ที่ตรงกัน เช่น การพิมพ์เส้นทางระบบไฟล์ไปยังเอาต์พุตมาตรฐาน คำสั่งนี้เริ่มต้นการค้นหาที่ไดเร็กทอรีในโครงสร้างแบบลำดับชั้นและสำรวจต้นไม้ แบบวนซ้ำ แม้ว่าจะสามารถจำกัดจำนวนระดับสูงสุดได้ก็ตาม เกณฑ์การค้นหาที่ใช้กันทั่วไป ได้แก่การจับคู่รูปแบบชื่อไฟล์การ จับคู่ ประเภทไฟล์และการจับคู่ช่วงเวลาสำหรับการแก้ไขครั้งล่าสุดหรือการเข้าถึงครั้งล่าสุด หากไม่มีอาร์กิวเมนต์ คำสั่งจะแสดงเส้นทางของแต่ละไฟล์ในต้นไม้ที่มีรากอยู่ที่ไดเร็กทอรีการทำงานคำสั่งนี้สามารถค้นหาผ่านระบบไฟล์ต่างๆ ของพาร์ติชันที่อยู่ในอุปกรณ์จัดเก็บข้อมูลตั้งแต่หนึ่งตัวขึ้นไปที่ติดตั้งอยู่ภายใต้ไดเร็กทอรีเริ่มต้น[ 1 ]คำสั่งนี้มีอยู่ในระบบ ที่คล้าย Unix ส่วนใหญ่
ตัวแปร
คำสั่งนี้ปรากฏครั้งแรกในUnix เวอร์ชัน 5ซึ่งเป็นส่วนหนึ่งของ โครงการ Programmer 's Workbenchและเขียนโดย Dick Haight ควบคู่ไปกับcpio [ 2 ]ซึ่งได้รับการออกแบบมาให้ใช้งานร่วมกัน[ 3 ]
การ ใช้งาน GNUนั้นเดิมทีเขียนโดย Eric Decker ต่อมาได้รับการปรับปรุงโดย David MacKenzie, Jay Plett และ Tim Wood [ 4 ]การใช้งาน GNU มีคุณสมบัติที่เหนือกว่าข้อกำหนด POSIX
คำสั่งดังกล่าวถูกพอร์ตไปยังระบบปฏิบัติการIBM i [ 5 ]
โปรแกรมคอมพิวเตอร์BusyBox มีคำสั่งนี้และคำสั่งอื่นๆ อีกมากมายในไฟล์ปฏิบัติการเดียว find
ใช้
ไวยากรณ์ของคำสั่งนี้สามารถอธิบายได้ดังนี้:
$ ค้นหาเส้นทาง [-H|-L]... [นิพจน์]
ตามธรรมเนียมแล้ว จะต้องมีเส้นทางอย่างน้อยหนึ่งเส้นทางนำหน้านิพจน์ แต่เวอร์ชันใหม่กว่าอนุญาตให้ไม่ต้องระบุเส้นทางก็ได้ โดยจะใช้ไดเร็กทอรีการทำงานเป็นค่าเริ่มต้น
นิพจน์สามารถระบุรายละเอียดต่างๆ ได้ รวมถึงเกณฑ์การจับคู่และการกระทำที่จะดำเนินการกับไฟล์ที่ตรงกัน องค์ประกอบของนิพจน์จะคั่นด้วยช่องว่างและจะถูกประเมินจากซ้ายไปขวา คำสั่งสามารถจับคู่โดยใช้ตัวอักษรตัวแทน (wildcard) ได้ แต่ข้อความจับคู่ตัวอักษรตัวแทนจะต้องอยู่ในเครื่องหมายคำพูดเพื่อป้องกันการใช้ globbing ของเชลล์หากละเว้นนิพจน์ ระบบจะจับคู่ไฟล์ทั้งหมด
การแสดงออก
นิพจน์ระบุลักษณะการทำงานของคำสั่ง รวมถึงไฟล์ที่จะเลือก (บางครั้งเรียกว่าเงื่อนไข) และสิ่งที่ต้องทำกับแต่ละไฟล์ที่ตรงกัน (บางครั้งเรียกว่าการกระทำ) โดยทั่วไปแล้วองค์ประกอบของนิพจน์ประกอบด้วย:
-name pattern- เลือกไฟล์ที่มีชื่อตรงกับรูปแบบ shell-glob
-type type- เลือกไฟล์ที่เป็น ประเภทไฟล์ Unixเฉพาะ:
d: ไดเร็กทอรี
fไฟล์ปกติ
pท่อที่มีชื่อ
s: ซ็อกเก็ต
Dประตู
-print- พิมพ์ชื่อไฟล์ที่พบพร้อมขึ้นบรรทัดใหม่ไปยังเอาต์พุตมาตรฐานหากนิพจน์ไม่มีตัวเลือกการกระทำ (เช่น
-print0,-exec, หรือ-ok) การกระทำของ-printจะถูกดำเนินการ
-print0- แสดงชื่อไฟล์ที่พบพร้อมอักขระว่าง (null)ออกทางเอาต์พุตมาตรฐาน (ไม่จำเป็นต้องใช้ตามมาตรฐาน POSIX)
-exec program [argument...] ;- เรียกใช้โปรแกรมพร้อมอาร์กิวเมนต์สำหรับไฟล์เป้าหมายแต่ละไฟล์ โดยเลือกไฟล์ที่โปรแกรมส่งผลให้สถานะการออกเป็น 0 หากโปรแกรมหรืออาร์กิวเมนต์เป็นค่าว่าง
{}จะถูกแทนที่ด้วยเส้นทางของไฟล์เป้าหมาย มาตรฐาน POSIX ไม่ได้ระบุว่าจะเกิดอะไรขึ้นหาก{}มีการระบุหลายไฟล์ การใช้งานส่วนใหญ่จะแทนที่แต่ละไฟล์{}ด้วยเส้นทางของไฟล์เป้าหมาย
-exec program [argument...] {} +- เรียกใช้โปรแกรมที่มีอาร์กิวเมนต์ตามด้วยเส้นทางที่เป็นไปได้มากที่สุดเท่าที่จะเป็นไปได้ จะมีการเรียกใช้คำสั่งหลายคำสั่งหากขนาดบรรทัดคำสั่งสูงสุดเกินกำหนด เช่นเดียวกับxargs ) [ 6 ]
-ok program [argument...] ;- สำหรับแต่ละเส้นทางที่เป็นไปได้ ระบบจะขอให้ผู้ใช้ยืนยัน หากผู้ใช้ยืนยัน (โดยทั่วไปคือการป้อนyหรือyes ) ระบบจะทำงานตามปกติมิฉะนั้น คำสั่งจะไม่ถูกเรียกใช้สำหรับเส้นทางที่เป็นไปได้นั้น และไฟล์จะไม่ถูกเลือก
-exec program [arguments...] ;
-maxdepth- จำกัดความลึกของไดเร็กทอรีที่จะค้นหา ตัวอย่างเช่น
-maxdepth 2จำกัดการค้นหาเฉพาะไดเร็กทอรีรากและไดเร็กทอรีย่อยโดยตรงเท่านั้น
-mtime,-ctime,-atime- เวลาแก้ไข เวลาเปลี่ยนแปลง inodeและเวลาเข้าถึง ตามลำดับ เลือกไฟล์ที่มีข้อมูลเมตาเวลาตรงกับจำนวนวันก่อนหน้า หากมี
+คำนำหน้า ตัวเลขจะระบุอย่างน้อย และหากมี-คำนำหน้า ตัวเลขจะระบุน้อยกว่า
-daystart- ให้เริ่มนับเวลาจากต้นวัน แทนที่จะนับจาก 24 ชั่วโมงที่ผ่านมา
-newer [file],-cnewer [file],-anewer [file]- เลือกไฟล์ที่มีการแก้ไขล่าสุดกว่าไฟล์ที่กำหนด ฟังก์ชันนี้รองรับ
-notการกำหนดคำนำหน้าสำหรับผลลัพธ์แบบย้อนกลับหรือช่วง
-newermt YYYY-MM-DD- เลือกไฟล์ที่มีการแก้ไขครั้งล่าสุดหลังวันที่กำหนด นอกจากนี้ยังรองรับ
-notการกำหนดคำนำหน้าสำหรับวันที่แก้ไขก่อนหน้า ด้วย
ผู้ปฏิบัติงาน
ตัวดำเนินการใช้สำหรับรวมองค์ประกอบของนิพจน์ ตัวดำเนินการเรียงลำดับตามความสำคัญจากมากไปน้อย:
- ลำดับความสำคัญ
( expr ); เลือกลำดับการประเมินของนิพจน์ย่อย
- การปฏิเสธ
! exprเป็นจริงถ้าexprเป็นเท็จ
- ตรรกะและ
expr1 expr2หรือexpr1 -a expr2;expr2จะไม่ถูกประเมินหากexpr1เป็นเท็จ
- ตรรกะหรือ
expr1 -o expr2;expr2จะไม่ถูกประเมินหากexpr1เป็นจริง
การข้ามลิงก์เชิงสัญลักษณ์
เนื่องจากระบบไฟล์สามารถมีโครงสร้างแบบวนซ้ำได้ผ่านทางฮาร์ด ลิงก์ และซอฟต์ลิงก์ มาตรฐาน POSIX จึงกำหนดให้คำสั่งต้องตรวจจับลูปอนันต์ กล่าวคือ การเข้าสู่ไดเร็กทอรีที่เคยเข้าชมมาก่อนซึ่งเป็นบรรพบุรักษ์ของไฟล์สุดท้ายที่พบ เมื่อตรวจพบลูปอนันต์ คำสั่งจะต้องเขียนข้อความวินิจฉัยไปยังข้อผิดพลาดมาตรฐาน พร้อมทั้งกู้คืนตำแหน่งในลำดับชั้นหรือยุติการทำงาน
ตัว เลือก -Hและ-Lที่ระบุไว้ในมาตรฐาน POSIX ควบคุมวิธีการที่คำสั่งจัดการกับลิงก์สัญลักษณ์พฤติกรรมเริ่มต้นคือไม่ติดตามลิงก์สัญลักษณ์-Lตัวเลือกทำให้คำสั่งติดตามลิงก์สัญลักษณ์-Hตัวเลือกทำให้คำสั่งติดตามลิงก์สัญลักษณ์ในขณะที่ประมวลผลอาร์กิวเมนต์บรรทัดคำสั่ง[ 6 ]ส่วนขยายทั่วไปคือ-Pตัวเลือกสำหรับการปิดใช้งานการติดตามลิงก์สัญลักษณ์อย่างชัดเจน[ 7 ] [ 8 ]
ตัวอย่าง
ค้นหาโดยใช้สัญลักษณ์ตัวแทน (wildcard)
คำสั่งต่อไปนี้จะค้นหาไฟล์ในโครงสร้างไดเร็กทอรีปัจจุบันที่มีชื่อขึ้นต้นด้วย "my" เครื่องหมายอัญประกาศเดี่ยวจะช่วยป้องกันการขยายคำโดยเชลล์ หากไม่มีเครื่องหมายอัญประกาศเดี่ยว เชลล์จะแทนที่ "my*" ด้วยรายการไฟล์ที่มีชื่อขึ้นต้นด้วย "my" ในไดเร็กทอรีปัจจุบัน ซึ่งอาจไม่เหมือนกับไฟล์ที่ตรงกันในไดเร็กทอรีย่อย
$ find . -name 'my*'จำกัดประเภทไฟล์
คำสั่งต่อไปนี้มีฟังก์ชัน-type fจำกัดผลลัพธ์ให้เฉพาะไฟล์ปกติ โดยไม่รวมรายการอื่นๆ ในระบบไฟล์ เช่น โฟลเดอร์และลิงก์สัญลักษณ์
$ find . -type f ระบุรายละเอียดไฟล์
คำสั่งต่อไปนี้มี-lsตัวเลือกการดำเนินการเพื่อรวมข้อมูลไฟล์โดยละเอียดเช่นเดียวกับคำสั่งls -a.
$ find . -ls ไม่รวมโครงสร้างไดเร็กทอรีย่อย
คำสั่งต่อไปนี้จะ ค้นหา ไฟล์ปกติชื่อ ในทุกไดเร็กทอรี ยกเว้นไดเร็กทอรีย่อย/not/this/oneที่ระบุโดย ตัวเลือก-prunemyfile
$ find / -path /not/this/one -prune -o -type f -name myfile -print ค้นหาในหลายไดเร็กทอรี
คำสั่งต่อไปนี้จะค้นหาไฟล์ที่มีชื่ออยู่ในโครงสร้างไดเร็กทอรี หลัก diraและ ไดเร็กทอรี ย่อย dirbmyf
$ find dira dirb -name myf ค้นหาไฟล์ใดไฟล์หนึ่งที่มีชื่อแตกต่างกัน
คำสั่งต่อไปนี้จะค้นหาไฟล์ที่มีชื่อลงท้ายด้วย "jsp" หรือ "java" โดยการรวม-nameตัวเลือกสองตัวเข้าด้วยกัน-oนิพจน์ย่อย ( -name '*jsp' -o -name '*java') อยู่ภายในวงเล็บซึ่งแต่ละวงเล็บจะถูกหลีกเลี่ยงด้วยเครื่องหมายแบ็กสแลชเพื่อป้องกันไม่ให้ถูกตีความว่าเป็นอักขระพิเศษของเชลล์
$ find . \( -name '*jsp' -o -name '*java' \)เรียกใช้โปรแกรม
คำสั่งต่อไปนี้จะเปลี่ยนสิทธิ์การเข้าถึงของไฟล์ทั้งหมดที่มีชื่อตรงกับ "*.mp3" ในโครงสร้างไดเร็กทอรี "/var/ftp/mp3" การกระทำนี้ระบุโดย `<ชื่อไฟล์>` สำหรับแต่ละไฟล์ที่ตรงกัน คำสั่งจะถูกดำเนินการโดยแทนที่ `<ชื่อไฟล์>` ด้วยชื่อไฟล์ เครื่องหมายเซมิโคลอน (พร้อมเครื่องหมายแบ็กสแลชนำหน้าเพื่อป้องกันไม่ให้เชลล์ตีความว่าเป็นตัวคั่นคำสั่ง) แสดงถึงจุดสิ้นสุดของคำสั่ง ในบางเชลล์ `<ชื่อไฟล์>` ต้องอยู่ในเครื่องหมายอัญประกาศ ส่วนท้ายมักจะถูกหลีกเลี่ยงด้วยเครื่องหมาย `<br>` นำหน้าแต่สามารถใส่ไว้ในเครื่องหมายอัญประกาศเดี่ยวแทนได้ -exec chmod 644 {} \;chmod 644 {}{}{};\
$ find /var/ftp/mp3 -name '*.mp3' -type f -exec chmod 644 {} \;ลบไฟล์
คำสั่งต่อไปนี้จะลบไฟล์ว่างและพิมพ์ชื่อไฟล์-deleteตัวเลือกนี้เป็นส่วนขยายที่เพิ่มเข้ามาในระบบปฏิบัติการตระกูล BSD บางระบบ[ 9 ]และมีอยู่ในFreeBSD 2.2.1 และเวอร์ชันต่อมา[ 10 ] NetBSD 5.0 และเวอร์ชันต่อมา[ 11 ] OpenBSD 6.1 และเวอร์ชันต่อมา[ 12 ] DragonFly BSD [ 13 ] GNU find [ 14 ]และmacOS [ 15 ]
$ find . -empty -delete -print ค้นหาตามเจ้าของ
คำสั่งต่อไปนี้ใช้ค้นหาไฟล์ที่เป็นกรรมสิทธิ์ของผู้ใช้หมายเลข 123
$ find . -user 123ไม่ต้องสนใจตัวพิมพ์เล็กหรือใหญ่
คำสั่งต่อไปนี้จะจับคู่ชื่อไฟล์โดยไม่สนใจตัวพิมพ์ใหญ่เล็ก-inameตัวเลือกนี้ไม่จำเป็นต้องใช้ตามมาตรฐาน POSIX
$ find . -iname 'MyFile*'หาก-inameระบบของคุณไม่รองรับสวิตช์ดังกล่าว อาจใช้วิธีการแก้ไขปัญหาอื่นได้ เช่น:
$ find . -name '[mM][yY][fF][iI][lL][eE]*'ค้นหาตามขนาด
คำสั่งต่อไปนี้ใช้ค้นหาไฟล์ที่มีขนาดระหว่าง 100 กิโลไบต์ถึง 500 กิโลไบต์
$ find . -size +100k -a -size -500k ค้นหาตามเวลา
คำสั่งต่อไปนี้จะค้นหาไฟล์ในโฟลเดอร์เอกสารที่ได้รับการแก้ไขในช่วงสัปดาห์ที่ผ่านมา
$ find ~/Documents/ -mtime -7 คำสั่งต่อไปนี้จะค้นหาไฟล์ที่แก้ไขครั้งล่าสุดในเดือนกุมภาพันธ์ 2560
$ find ~/Documents/ -newermt 2017 -02-01 -not -newermt 2017 -03-01 คำสั่งต่อไปนี้จะแสดงรายการไฟล์ที่ได้รับการแก้ไขล่าสุดกว่าไฟล์ "document.txt"
$ find ~/Documents/ -newer document.txt ยูทิลิตี้ที่เกี่ยวข้อง
grep- คำสั่งสำหรับค้นหาข้อความธรรมดาที่ตรงกับนิพจน์ปกติ
find- คำสั่งบนระบบที่ใช้ Microsoft เป็นพื้นฐาน ซึ่งแม้จะมีชื่อเดียวกัน แต่ก็มีฟังก์ชันการทำงานที่แตกต่างอย่างมากจากคำสั่งบนระบบ Unix
dir- คำสั่งที่ใช้กันทั่วไปสำหรับการแสดงรายการไฟล์บนระบบที่ใช้ Microsoft คำสั่งนี้มี
/sตัวเลือกในการค้นหาไฟล์หรือไดเร็กทอรีแบบวนซ้ำ
tree- คำสั่งบนระบบที่ใช้ Microsoft เป็นพื้นฐาน ซึ่งจะแสดงรายการไฟล์ในโครงสร้างไดเร็กทอรีแบบวนซ้ำ โดยเว้นวรรคชื่อไฟล์ตามตำแหน่งในลำดับชั้นของไฟล์
walkและsor- คำสั่งบนPlan 9 จากระบบ Bell Labsที่ให้ฟังก์ชันการทำงานที่คล้ายคลึงกันกับ
findการwalkค้นหาไฟล์ในโครงสร้างไดเร็กทอรีและพิมพ์ชื่อและsorตัวกรอง (เช่นgrep) โดยการประเมินนิพจน์ในรูปแบบของสคริปต์เชลล์ คำสั่งเหล่านี้ไม่ได้เป็นส่วนหนึ่งของPlan 9 จาก User Spaceดังนั้น Benjamin Barenblat ของ Google จึงมีเวอร์ชันที่พอร์ตไปยังระบบ POSIX ซึ่งสามารถใช้งานได้ผ่าน GitHub [ 16 ]
locate- เครื่องมือที่ค้นหาข้อมูลในฐานข้อมูล ที่สร้างไว้ล่วงหน้า แทนที่จะค้นหาในระบบไฟล์ ประสิทธิภาพ
locateอาจสูงกว่าfindแต่ผลลัพธ์อาจไม่ถูกต้องหากฐานข้อมูลล้าสมัย โดยทั่วไป ฐานข้อมูลจะได้รับการอัปเดตจากข้อมูลในระบบไฟล์ผ่านfindคำสั่งที่ทำงานเป็นระยะโดยcronงาน (job)
ดูเพิ่มเติม
- ตัวกรอง (ฟังก์ชันลำดับสูง) – ฟังก์ชันการเขียนโปรแกรมคอมพิวเตอร์
- find (Windows) – คำสั่งเชลล์ที่ใช้ค้นหาข้อความในไฟล์
- forfiles – คำสั่งของ Windows ที่ใช้ค้นหาไฟล์ตามคุณลักษณะ คล้ายกับคำสั่งของ Unix
find - grep – ยูทิลิตี้แบบบรรทัดคำสั่งสำหรับการค้นหาข้อความ
- รายการคำสั่ง POSIX
- รายการคำสั่ง DOS
- Spotlight (Apple) – ฟีเจอร์ค้นหาที่พบในอุปกรณ์ Apple
หมายเหตุ
- ^ตามศัพท์เฉพาะของระบบ Unix โดยทั่วไปไฟล์คือรายการในระบบไฟล์ ซึ่งสามารถเป็นไฟล์ประเภทใดก็ได้ของ Unix รวมถึงไฟล์ทั่วไป ไดเร็กทอรี หรือประเภทเฉพาะอื่นๆ
ลิงก์ภายนอก
- เว็บไซต์อย่างเป็นทางการของ GNU find
- คำสั่ง find – 25 ตัวอย่างการใช้งานจริง
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ค้นหา (ยูนิก)
find เป็น คำสั่ง เชลล์ ที่ค้นหา ไฟล์ [ a ] ตามเกณฑ์การค้นหาและดำเนินการกับไฟล์ที่ตรงกัน เช่น การพิมพ์ เส้นทาง ระบบไฟล์ ไปยัง เอาต์พุตมาตรฐาน คำสั่ง นี้เริ่มต้นการค้นหาที่...
ตัวแปร
คำสั่งนี้ปรากฏครั้งแรกใน Unix เวอร์ชัน 5 ซึ่งเป็นส่วนหนึ่งของ โครงการ Programmer 's Workbench และเขียนโดย Dick Haight ควบคู่ไปกับ cpio [ 2 ] ซึ่งได้รับการออกแบบมาให้ใช้งานร่วมกัน [ 3 ]
ใช้
ไวยากรณ์ของคำสั่งนี้สามารถอธิบายได้ดังนี้:
ผู้ปฏิบัติงาน
ตัวดำเนินการใช้สำหรับรวมองค์ประกอบของนิพจน์ ตัวดำเนินการเรียงลำดับตามความสำคัญจากมากไปน้อย: