ความแตกต่างระหว่างการค้นหาคืออะไร และค้นหา -พิมพ์


27

อะไรคือความแตกต่างระหว่าง:

find .

และ

find . -print

สิ่งที่ไม่-printจริงทำอย่างไร

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt

คำตอบ:


41

จากfindutils findmanpage :

หากไม่ได้กำหนดนิพจน์นิพจน์-printนั้นจะถูกใช้ (แต่คุณควรพิจารณาใช้-print0แทน)

( -printคือfindนิพจน์)

เอกสาร POSIXยืนยัน:

หากไม่มีการแสดงออกเป็นปัจจุบัน-printจะถูกนำมาใช้เป็นสำนวนที่ว่า

ดังนั้นจึงfind .เทียบเท่ากับfind . -print; ตัวแรกไม่มีนิพจน์ดังนั้นจึง-printถูกเพิ่มภายใน

คำอธิบายของสิ่งที่-printเกิดขึ้นใน manpage:

-print

ทรู; พิมพ์ชื่อไฟล์แบบเต็มบนเอาต์พุตมาตรฐานตามด้วย newline หากคุณกำลังท่อส่งออกของการค้นหาลงในโปรแกรมอื่นและมีความเป็นไปได้ด้วยซ้ำว่าไฟล์ที่คุณกำลังค้นหาอาจมีการขึ้นบรรทัดใหม่แล้วคุณควรพิจารณาอย่างจริงจังโดยใช้ตัวเลือกแทน-print0 -printดูส่วนไฟล์ผิดปกติสำหรับข้อมูลเกี่ยวกับวิธีจัดการกับอักขระผิดปกติในชื่อไฟล์


เรียงคำถามระดับเริ่มต้น แต่สิ่งที่คุณพูดคุยเกี่ยวกับการแสดงออกนี้คืออะไร? นิพจน์ปกตินี้หรือไม่
ฤRษี Prakash

2
@Rishi ดูmanpage
Stephen Kitt

20

-printเป็นค่าเริ่มต้นการดำเนินการ บางfindภาคจะถือว่าเป็นกระทำตรงข้ามกับฟิลเตอร์หรือเงื่อนไข ตัวอย่างเช่น-type fไม่ใช่การกระทำ -execเป็นการกระทำแม้ว่าจะสามารถใช้เป็นเงื่อนไขได้ก็ตาม

การดำเนินการรวม-print, และ-exec -okบางfindการใช้งานที่มีภาคการดำเนินการอื่น ๆ ที่ไม่ได้มาตรฐานเช่น-print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

ในกรณีที่ไม่มีของ<some-predicates>มีการกระทำที่เทียบเท่ากับ:

find files \( <some-predicates> \) -print

(สังเกตเครื่องหมายวงเล็บด้านบนซึ่งมีความสำคัญหากมี-oตัวดำเนินการบางตัว)

เมื่อมีข้อสงสัยที่ดีที่สุดคือการใช้-printอย่างชัดเจน (หรือ-exec printf '%s\0' {} +(หรือ-print0ถ้ามี)) เพื่อให้สามารถประมวลผลเอาท์พุท)

การ-printกระทำเริ่มต้นจะถูกระบุโดย POSIX การใช้งานแบบเก่าบางอย่างfindต้องมีความชัดเจน-printแต่โดยทั่วไปจะไม่พบในไวด์เว็บในปัจจุบัน

นอกจากนี้โปรดทราบว่าfindการใช้งานบางอย่างอนุญาตให้ละเว้นfilesซึ่งในกรณีนี้พวกเขาเริ่มต้นการค้นหาในไดเรกทอรีปัจจุบัน นั่นคือสำหรับพวกเขา

find

เทียบเท่ากับ

find .
find . -print

อย่างไรก็ตามมันไม่ได้เป็นมาตรฐานดังนั้นจึงควรหลีกเลี่ยงที่ดีที่สุด

ในตอนท้ายของสเปกตรัม (และมีประโยชน์) ที่ละเอียดมากขึ้นfindการใช้งานบางอย่างยังอนุญาตให้ส่งผ่านพา ธ ไฟล์เป็นอาร์กิวเมนต์ไปยัง-fตัวเลือกดังเช่น:

find -f "$file1" -f "$file2" -print

มันเป็นfindการนำไปใช้งานเพียงอย่างเดียวที่อนุญาตให้ส่งผ่านพา ธ ไฟล์ไปที่findใดก็ได้ การใช้งานอื่นไม่สามารถยอมรับพา ธ ไฟล์เช่น!หรือ-print... ดังนั้นfind "$file" -print(หรือแม้กระทั่งfind -- "$file" -print) ถือว่า$fileไม่ใช่ชื่อของเพรดิเคตfind(หรือตัวเลือกในกรณีแรก)

น่าเสียดายที่ไม่ได้มาตรฐานหรือพกพาอย่างใดอย่างหนึ่ง


หากไม่ใช่มาตรฐานและควรหลีกเลี่ยงทำไมจึงควรตั้งชื่อให้ดีที่สุด ?
ไอแซค

@Isaac เพราะพวกเขาจะมีประโยชน์ / การพิมพ์ผิดเป็นไปได้ ...
vonbrand

8

พวกเขาเหมือนกันพวกเขาทั้งคู่ออกลำดับชั้นไดเรกทอรีทั้งหมดจากไดเรกทอรีปัจจุบัน

จากPOSIX ค้นหาเอกสาร :

คำสั่งต่อไปนี้เทียบเท่า:

หา

หา -พิมพ์


4

ใน Linux ไม่มีความแตกต่าง แต่ระบบอื่น ๆ (เช่น AIX เป็นต้น) ต้องการ-printหากคุณต้องการแสดงผลลัพธ์ของคำสั่งบนหน้าจอของคุณ


3
นั่นจะเป็นเวอร์ชันเก่ามากของ AIX แล้ว AIX 4.3 findไม่ต้องการมัน AIX ได้รับมาตรฐาน POSIX มานานหลายทศวรรษ
Stéphane Chazelas

3

เป็นเวลาหลายปีที่คำสั่ง find ไม่ได้มีการดำเนินการเริ่มต้น ข้อผิดพลาดทั่วไปคือการลืมเพิ่มตัวเลือก -print ในคำสั่ง find ของคุณ วันนี้ฉันยังพิมพ์นิสัยไม่ออก

แต่ในบางจุดมันถูกเพิ่มเป็นการกระทำเริ่มต้นดังนั้นตอนนี้find .และfind . -printเทียบเท่า


1

บางครั้งมันจะมีประโยชน์ในการใช้-printอย่างชัดเจนเมื่อคุณทำการกระทำอื่นเพื่อให้ชื่อไฟล์ปรากฏขึ้นเมื่อทำการกระทำนั้น

find . -print -delete

จะคล้ายกับ

rm -rfv *

ที่สอดคล้องกับ-print -vหากคุณไม่ได้รวม-printชื่อไฟล์จะไม่ปรากฏขึ้น

เพื่อทำให้rmคำสั่งคล้ายกันมากยิ่งขึ้นโดยวิธีการออกคำสั่ง Bash นี้ก่อน

shopt -s dotglob

ซึ่งจะทำให้ไฟล์*จับคู่จุด (ซ่อน)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.