กลับไปหน้าบทความ

อ่าน 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เฉพาะ:
b: อุปกรณ์บล็อก (บัฟเฟอร์)
c: อุปกรณ์อักขระ (ไม่บัฟเฟอร์)
d: ไดเร็กทอรี
fไฟล์ปกติ
l: ลิงก์สัญลักษณ์
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 ]
fd
ทางเลือกอื่นนอกเหนือจาก การ เขียนfindด้วยRust [ 17 ]
locate
เครื่องมือที่ค้นหาข้อมูลในฐานข้อมูล ที่สร้างไว้ล่วงหน้า แทนที่จะค้นหาในระบบไฟล์ ประสิทธิภาพlocateอาจสูงกว่าfindแต่ผลลัพธ์อาจไม่ถูกต้องหากฐานข้อมูลล้าสมัย โดยทั่วไป ฐานข้อมูลจะได้รับการอัปเดตจากข้อมูลในระบบไฟล์ผ่านfindคำสั่งที่ทำงานเป็นระยะโดยcronงาน (job)

ดูเพิ่มเติม

หมายเหตุ

  1. ^ตามศัพท์เฉพาะของระบบ Unix โดยทั่วไปไฟล์คือรายการในระบบไฟล์ ซึ่งสามารถเป็นไฟล์ประเภทใดก็ได้ของ Unix รวมถึงไฟล์ทั่วไป ไดเร็กทอรี หรือประเภทเฉพาะอื่นๆ
  • เว็บไซต์อย่างเป็นทางการของ GNU find
  • คำสั่ง find – 25 ตัวอย่างการใช้งานจริง
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Find_(Unix)&oldid=1349967912 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ค้นหา (ยูนิก)

find เป็น คำสั่ง เชลล์ ที่ค้นหา ไฟล์ [ a ] ตามเกณฑ์การค้นหาและดำเนินการกับไฟล์ที่ตรงกัน เช่น การพิมพ์ เส้นทาง ระบบไฟล์ ไปยัง เอาต์พุตมาตรฐาน คำสั่ง นี้เริ่มต้นการค้นหาที่...

ตัวแปร

คำสั่งนี้ปรากฏครั้งแรกใน Unix เวอร์ชัน 5 ซึ่งเป็นส่วนหนึ่งของ โครงการ Programmer 's Workbench และเขียนโดย Dick Haight ควบคู่ไปกับ cpio [ 2 ] ซึ่งได้รับการออกแบบมาให้ใช้งานร่วมกัน [ 3 ]

ใช้

ไวยากรณ์ของคำสั่งนี้สามารถอธิบายได้ดังนี้:

ผู้ปฏิบัติงาน

ตัวดำเนินการใช้สำหรับรวมองค์ประกอบของนิพจน์ ตัวดำเนินการเรียงลำดับตามความสำคัญจากมากไปน้อย: