ฉันจะลบคำสั่งการพิมพ์“ สิทธิ์ที่ถูกปฏิเสธ” ออกจากโปรแกรม find ได้อย่างไร


38

รหัส

find / -name netcdf

เอาท์พุต

find: `/root/.dbus': Permission denied
find: `/root/.gconf': Permission denied
find: `/root/.gconfd': Permission denied
find: `/root/.gnome': Permission denied
find: `/root/.gnome2': Permission denied
find: `/root/.gnome2_private': Permission denied

ที่เกี่ยวข้อง: unix.stackexchange.com/q/290791/16920
Hertz 준영

คำตอบ:


35

ข้อความเหล่านั้นจะถูกส่งไปยัง stderr และโดยทั่วไปแล้วจะมีเพียงข้อความเหล่านี้เท่านั้นที่เห็นในสตรีมเอาต์พุต คุณสามารถปิดหรือเปลี่ยนเส้นทางบนบรรทัดคำสั่ง

$ find / -name netcdf 2>&-

หรือ

$ find / -name netcdf 2>/dev/null

นอกจากนี้หากคุณกำลังค้นหาไดเรกทอรีรูท (/) ดังนั้นจึงเป็นการดีที่จะทำให้กระบวนการดีขึ้นดังนั้นการค้นหาไม่ได้ใช้ทรัพยากรทั้งหมด

$ nice find / -name netcdf 2>&-

สิ่งนี้จะลดลำดับความสำคัญของกระบวนการที่ช่วยให้กระบวนการอื่นใช้เวลาในการประมวลผลมากขึ้น แน่นอนถ้าไม่มีอะไรใช้ CPU ก็ไม่ได้ทำอะไรเลย :) เพื่อให้เป็นเทคนิคค่า NI (ดูจากps -l) เพิ่มค่า PRI ค่า PRI ที่ต่ำกว่ามีลำดับความสำคัญสูงกว่า เปรียบเทียบกับps -lnice ps -l


1
ฉันไม่ชอบที่จะโยนคำเตือนออกไป มันจะดีกว่ามากในการจัดการกับพวกเขา นอกจากนี้ไม่มีการหลบหนีที่นี่ในสนาม
LéoLéopold Hertz 준영

1
@ LéoLéopoldHertz 준 영 ดี ... ถ้าคุณไม่สามารถเห็นผลลัพธ์โปรแกรมเพราะหน้าจอของคุณเต็มไปด้วยความอึข้อผิดพลาด .. ซึ่งเป็นกรณีนี้ ...
chrips

20

ฉันอยากจะชี้ให้เห็นคำตอบนี้โดย @Gilles ในเส้นทางที่ไม่รวมที่ทำให้ค้นหาบ่นเกี่ยวกับสิทธิ์ - Unix & Linux Stack Exchange ; โดยพื้นฐานแล้วมันเกี่ยวข้องกับการสร้างfindสิ่งที่ทำให้ไม่สามารถเข้าถึงไดเรกทอรีที่อ่านไม่ได้และในแง่นั้นอาจจะเร็วขึ้นอีกเล็กน้อย

นี่ดูเหมือนจะใช้ได้สำหรับฉัน:

ด้วย GNU findหรืออื่น ๆfindที่รองรับ-readableและเพรดิเคต-executable:

find / -type d ! \( -readable -executable \) -prune -o -type f -name netcdf -print

หรือสิ่งนี้:

find / -type d ! -perm -g+r,u+r,o+r -prune -o -type f -name 'netcdf' -print

ด้วยเหตุผลบางอย่างฉันต้องเพิ่มทั้งหมดg+r,u+r,o+r(ทางลัดสำหรับที่เป็นa+r) มิฉะนั้นหากหนึ่งในนั้นถูกปล่อยออกมาฉันอาจยังคงได้รับความนิยม "ปฏิเสธสิทธิ์"

นี่คือรายละเอียดของวิธีที่ฉันเห็นนี้ (หมายเหตุ-a(และ) ผู้ประกอบการในfindเป็นนัยระหว่างเพรดิเคตสอง ):

find /         # find starting from path /
  -type d        # match type is directory
  ! -perm -a+r   # (and) match not permissions of `r`ead present 
  -prune         # ignore what matched above and do not descend into it
  -o             # or (whatever didn't match above)
  -type f        # match type is file
  -name 'netcdf' # (and) match name is 'netcdf'
  -print         # print what matched above

โปรดทราบว่าหากไม่มีรายการสุดท้าย-printฉันจะได้รับรายการพิเศษบางรายการที่แสดง (ซึ่งไม่มีส่วนเกี่ยวข้อง-name 'netcdf') -printเพื่อให้แน่ใจว่ามีเพียงตรงกับชื่อที่มีการพิมพ์ (ถ้ามี)


2
หากfind(1)ไม่สามารถลงไปในไดเรกทอรีมันจะไม่ ดังนั้นการตรวจสอบก่อนว่ามันจะเพิ่มงานได้หรือไม่ (ตรวจสอบสองครั้ง) และทำให้ช้าลง
vonbrand

3
@ vonbrand เป็นสิ่งจำเป็นหากคุณพึ่งพาfindสถานะทางออกเนื่องจากข้อผิดพลาดในการอนุญาตทำให้findออกด้วยสถานะที่ไม่เป็นศูนย์
Ernest A

ฉันไม่สามารถรับข้อเสนอของคุณได้ ฉันไม่ได้รับเอาต์พุตเมื่อเอาต์พุตที่คาดหวังเต็ม unix.stackexchange.com/q/290791/16920อย่างไรก็ตามฉันคิดว่าอย่างอื่นฉันคิดว่าวิธีการของคุณเป็นวิธีที่ดีที่สุด
LéoLéopold Hertz 준영

1
ว้าวฉันไม่อยากจะเชื่อเลยว่ามันยากที่จะหาคำตอบนี้ฉันหวังว่าฉันจะทำได้มากกว่าแค่โหวตขึ้นมา
ลิ่ม

8

ใช้locate(1)แทน:

$ locate netcdf

มันจะแสดงเฉพาะไฟล์ที่ผู้ใช้ของคุณเห็น


1
นี่ถือว่าupdatedbเป็นการทำงานปกติ นั่นไม่ใช่กรณีในระบบ Linux ทั้งหมด
Arcege

3
หากติดตั้งตำแหน่ง (1) ฐานข้อมูลควรได้รับการปรับปรุงเป็นระยะ หากสิ่งนั้นไม่ได้เกิดขึ้นฉันจะจำไว้ว่าการกำหนดค่าผิดพลาดมากกว่าความผิดของการค้นหา (1) นอกจากนี้ใช้เวลาเพียงไม่กี่นาทีในการรันด้วยมือในกรณีที่ไม่ค่อยเกิดขึ้นซึ่งคุณกำลังมองหาไฟล์ที่ถูกเพิ่มเข้ามาตั้งแต่การอัพเดทฐานข้อมูลครั้งล่าสุด ฉันพบว่าตัวเองทำอย่างนั้นอาจครึ่งโหลต่อปีค่าใช้จ่ายที่จ่ายได้ง่ายจากความได้เปรียบด้านความเร็วของการค้นหา (1) มากกว่าการค้นหา (1)
Warren Young
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.