find . -type d
สามารถใช้เพื่อค้นหาไดเรกทอรีทั้งหมดด้านล่างบางจุดเริ่มต้น แต่จะส่งคืนไดเรกทอรีปัจจุบัน ( .
) ด้วยซึ่งอาจไม่พึงประสงค์ จะยกเว้นได้อย่างไร
find . -type d
สามารถใช้เพื่อค้นหาไดเรกทอรีทั้งหมดด้านล่างบางจุดเริ่มต้น แต่จะส่งคืนไดเรกทอรีปัจจุบัน ( .
) ด้วยซึ่งอาจไม่พึงประสงค์ จะยกเว้นได้อย่างไร
คำตอบ:
find . ! -path . -type d
สำหรับกรณีนี้โดยเฉพาะ ( .
) โรงแรมพร้อมสนามกอล์ฟที่ดีกว่าmindepth
การแก้ปัญหา (24 VS 26 ตัวอักษร) !
แม้ว่าเรื่องนี้อาจจะเป็นเพียงเล็กน้อยยากที่จะพิมพ์เพราะ
หากต้องการยกเว้นไดเรกทอรีอื่น ๆ สิ่งนี้จะใช้ได้น้อยกว่าและต้องการตัวแปรสำหรับความแห้ง:
D="long_name"
find "$D" ! -path "$D" -type d
ต้นไม้ตัดสินใจของฉันระหว่าง!
และ-mindepth
:
!
สำหรับพกพา.
? โยนเหรียญlong_name
? -mindepth
ใช้find / ! -regex '/\(a\|b\)/.*'
หรือมากกว่าเพียงแค่ท่อผ่าน grep หากต้องการไม่รับเงินคืนข้างต้นจะไม่มีประสิทธิภาพมากและคุณควรใช้-prune
: stackoverflow.com/questions/1489277//
find
กับgrep
เพื่อแยกไดเรกทอรี แต่ไดเรกทอรีหลักยังคงอยู่ทำให้ทุกอย่างถูกลบต่อไป
find
คุณจะต้องตรวจสอบคำนำหน้า: stackoverflow.com/questions/17959317//แต่ Bash for loop สามารถจัดการได้ :-)
\!
) เพื่อให้ปลอดภัย ตัวอย่างทั้งหมดในเครื่องของฉันman find
หนีออกมาแล้วดูเหมือนว่ามันอาจเป็น Good Idea ™ แก้ไข - เพิ่งสังเกตว่ามันบอกอย่างชัดเจนว่า:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
ไม่เพียง แต่ความลึกของการเรียกซ้ำที่find
สามารถควบคุมได้โดย-maxdepth
พารามิเตอร์ความลึกยังสามารถ จำกัด จาก“ top” โดยใช้-mindepth
พารามิเตอร์ที่เกี่ยวข้อง ดังนั้นสิ่งที่เราต้องการคือ
find . -mindepth 1 -type d
find . -mindepth 1 -maxdepth 1 -type d ...
ฉันใช้find ./* <...>
เมื่อฉันไม่สนใจที่จะละเว้น dotfiles ระดับแรก ( *
glob ไม่ตรงกับสิ่งเหล่านี้ตามค่าเริ่มต้นใน bash - ดูตัวเลือก 'dotglob' ใน shopt builtin: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html )
eclipse tmp # find . ./screen ./screen/.testfile2 ./.X11-unix ./.ICE-unix ./tmux-0 ./tmux-0/default
eclipse tmp # find ./* ./screen ./screen/.testfile2 ./tmux-0 ./tmux-0/default
-exec
ตัวเลือก ตัวอย่างเช่นถ้าคุณลองfind dir/* -type d -exec rmdir {} \;
คุณจะเห็นข้อผิดพลาด
rmdir
และส่วนใหญ่จะบอกคุณว่าไดเรกทอรีไม่ว่างเพราะfind
จะทำการค้นหาในเชิงลึกครั้งแรกในไดเรกทอรีแสดงผู้ปกครองก่อนที่ลูกของพวกเขา
วิธีแก้ปัญหาง่าย ๆ เช่นกัน (วิธีแก้ปัญหาไม่ทำงานสำหรับฉันบน windows git bash)
find * -type d
มันอาจจะไม่ได้มีประสิทธิภาพมากนัก แต่ทำให้งานสำเร็จและบางครั้งเราก็ต้องการ
[แก้ไข]: ตามที่ @AlexanderMills แสดงความคิดเห็นมันจะไม่แสดงไดเรกทอรีที่ซ่อนอยู่ในตำแหน่งราก (เช่น./.hidden
) แต่จะแสดงไดเรกทอรีย่อยที่ซ่อนอยู่ (เช่น./folder/.hiddenSub
) [ทดสอบกับทุบตี git บน windows]
find /path/ ! -path "/path/first" ! -path "/path/second"
นี้เป็นวิธีเดียวหรือไม่