วิธีค้นหาไฟล์ในไดเรกทอรีที่กำหนดและไม่สนใจไดเรกทอรีย่อยโดยใช้ bash


129

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

ไฟล์ / รูปแบบที่ฉันสนใจ: / dev / abc-scanner, / dev / abc-cash ....

คำสั่ง:

find /dev/ -name 'abc-*'

สิ่งที่ถูกส่งคืน:

/dev/abc-scanner
/dev/abc-cash
...
...
...
/dev/.udev/names/abc-scanner
/dev/.udev/names/abc-cash

ฉันต้องการละเว้นไฟล์หลัง: /dev/.udev / ...


9
ละเว้นไดเรกทอรีย่อยที่เฉพาะเจาะจงหรือไม่ลงไปในไดเรกทอรีย่อยใด ๆ สำหรับตัวหลังให้ใช้ตัวเลือก
-maxdepth

@frankc โพสต์เป็นคำตอบ
cnicutar

คำตอบ:


202

หากคุณต้องการ จำกัด การค้นหาในระดับแรกคุณสามารถทำได้:

 find /dev -maxdepth 1 -name 'abc-*'

... หรือหากคุณต้องการแยก.udevไดเรกทอรีโดยเฉพาะคุณสามารถทำได้:

 find /dev -name '.udev' -prune -o -name 'abc-*' -print

ถ้าฉันต้องการแสดงรายการที่ symlinks ข้างต้นทั้งหมดชี้ไปที่รูปแบบด้านบนฉันจะใช้ไพพ์หรือไม่ คล้ายกับ find / dev -maxdepth 1 -name 'abc- *' | คำสั่ง ls -l
ซุฟฟา

1
จะดีกว่าที่จะใช้xargsแทนเช่น: find /dev -maxdepth 1 -name 'abc-*' | xargs ls -lแต่ถ้ามีโอกาสที่พวกเขาจะมีช่องว่างในชื่อคุณควรทำfind /dev -maxdepth 1 -name 'abc-*' -print0 | xargs -0 ls -l
Mark Longair

อย่างไรก็ตามตามที่คำตอบของสตีเฟ่นดาร์ลิงตันชี้ให้เห็นฉันไม่แน่ใจว่าทำไมคุณถึงไม่ทำls -l /dev/abc-*
มาร์คลองแอร์

นอกจากนี้หากคุณต้องการทราบว่า symlinks ชี้ไปที่ใดคุณสามารถทำได้for x in /dev/abc-*; do readlink -f $x; done
Mark Longair

1
หรือถ้าคุณต้องการไดเรกทอรีย่อยเฉพาะในระดับแรกls -l /dev/abc-* /dev/*/abc-* | fgrep -v /dev/.udev... ยกเว้นอย่างน้อยในลินุกซ์ของฉัน/dev/*/*ไม่รวมถึงไฟล์ในเพื่อให้คุณสามารถละเว้น/dev/.udev/* fgrep -v
tripleee

9

มีเหตุผลใดที่คุณต้องการใช้findหรือไม่? คุณสามารถใช้lsเพื่อค้นหาไฟล์ที่ตรงกับรูปแบบในไดเรกทอรี

ls /dev/abc-*

หากคุณต้องการใช้findคุณสามารถใช้-maxdepth 1สวิตช์เพื่อใช้กับไดเรกทอรีที่ระบุเท่านั้น


ฉันคิดว่าคุณหมายถึง-maxdepth 1มากกว่า-maxdepth 0
Mark Longair

5
lsมันควรจะชี้ให้เห็นว่าตัวแทนเป็นส่วนที่สำคัญที่นี่ไม่ได้ คุณสามารถค้นหาไฟล์เดียวกันกับechoหรือwcหรือมีอะไรบ้างเพราะเชลล์ขยาย wildcard ให้คุณ ดังนั้นfor file in /dev/abc-*; do something with each "$file"; doneอาจเป็นสิ่งที่ OP กำลังมองหา
tripleee

1
อ่าฉันจำไม่ได้ว่าทางไหนเป็น ... ขอบคุณสำหรับการแก้ไข นอกจากนี้ยังมีข้อสังเกตว่ามันไม่เป็นสากล รุ่น Solaris ของfindไม่มีตัวอย่างเช่น
Stephen Darlington

@tripleee +1 ได้. ทำทุกอย่างในเปลือกจะดีกว่าถ้าเป็นไปได้
Stephen Darlington

1
@MustafaOzturk lsฟุ่มเฟือย for f in abc*; ...คือทั้งหมดที่คุณต้องการ
สตีเฟ่นดาร์ลิงตัน

4

นี่อาจทำสิ่งที่คุณต้องการ:

find /dev \( ! -name /dev -prune \) -type f -print

2
ใช่มันใช้งานได้ - maxdepth ไม่ได้ใช้งานในการค้นหาใน Unixes ที่เก่ากว่า
CCTO

-1
find /dev -maxdepth 1 -name 'abc-*'

ใช้งานไม่ได้สำหรับฉัน ไม่ส่งคืนอะไรเลย ถ้าฉันทำ '.' มันให้ไฟล์ทั้งหมดในไดเรกทอรีด้านล่างไฟล์ที่ฉันกำลังทำงานอยู่

find /dev -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls

ไม่ส่งคืนอะไรด้วย '.' ฉันได้รับรายชื่อไฟล์ 'ใหญ่' ทั้งหมดในไดเรกทอรีของฉันรวมถึงรูทไฟล์ / ไดเรกทอรีที่ฉันเก็บไฟล์เก่าไว้

อย่างต่อเนื่อง วิธีนี้ใช้ได้ผล

find ./ -maxdepth 1 -name "*.root" -type 'f' -size +100k -ls
564751   71 -rw-r--r--   1 snyder   bfactory   115739 May 21 12:39 ./R24eTightPiPi771052-55.root
565197  105 -rw-r--r--   1 snyder   bfactory   150719 May 21 14:27 ./R24eTightPiPi771106-2.root
565023   94 -rw-r--r--   1 snyder   bfactory   134180 May 21 12:59 ./R24eTightPiPi77999-109.root
719678   82 -rw-r--r--   1 snyder   bfactory   121149 May 21 12:42 ./R24eTightPiPi771098-10.root
564029  140 -rw-r--r--   1 snyder   bfactory   170181 May 21 14:14 ./combo77v.root

เห็นได้ชัด/dev ว่าหมายถึงไดเรกทอรีที่น่าสนใจ แต่เป็นสิ่งจำเป็นไม่เพียง./ .ความต้องการในการ/ไม่ชัดเจนแม้หลังจากที่ฉันคิดว่าอะไร/devมากหรือน้อย

ฉันไม่สามารถตอบกลับความคิดเห็นได้เนื่องจากฉันไม่มี 'ชื่อเสียง'


1
คุณได้รับชื่อเสียงด้วยการให้คำตอบที่ดี โปรดอ่านstackoverflow.com/conduct
aifrim

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