การค้นหาไดเรกทอรีย่อยภายในไดเรกทอรีทั้งหมดด้วยชื่อเดียวกัน


8

ฉันต้องการเรียกใช้คำสั่งเพื่อ:

  1. ค้นหาไดเรกทอรีทั้งหมดที่ชื่อ " inc" ในโฟลเดอร์ " X"
  2. รายการไดเรกทอรีย่อยทั้งหมดภายใต้ "" แต่ละX/.../inc/รายการ
  3. เปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์ชื่อ " list"

ฉันลองชุดคำสั่งด้านล่างหลายแบบโดยไม่ประสบความสำเร็จ:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


13

find สามารถทำได้ทั้งหมดด้วยตัวเอง:

find X -path '*/inc/*' -type d > list

อ่าน-pathส่วนของman findสำหรับข้อมูลเพิ่มเติม

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


ใช่. ฉันให้คำตอบเดียวกันกับที่นี่
Prince John Wesley

หรือค้นหา X-name 'inc' -type d> list
MaQleod

@MaQleod: ไม่นั่นไม่ใช่คำถาม
Daniel Andersson

4

นี่คือหนึ่งซับที่มีประโยชน์:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

มันทำงานfindในfindผลลัพธ์แรกๆ execตัวเลือกนอกจากนี้ยังสามารถใช้คำสั่งเชลล์น้อยที่สุดซึ่งใน - ที่ผมกล่าวว่า - จะถูกแทนที่ด้วยไดเรกทอรีแรกแต่ละ{}find

ความfindประสงค์ที่สองตามที่คุณต้องการ "แสดงรายการไดเรกทอรีย่อยทั้งหมด" ของผลลัพธ์แรกรวมถึงincไดเรกทอรี หากคุณไม่ต้องการให้ตัวเองอยู่ในเอาต์พุตให้ปล่อยโฟลเดอร์find ที่สองอย่างน้อยที่ระดับความลึก 1

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

จากนั้นเราจะเปลี่ยนเพียงคำสั่งของเข้ามาstdoutlist


การเปลี่ยนแปลงคำตอบนั้นมีประโยชน์กับฉันเมื่อฉันต้องการไดเร็กตอรี่ย่อย 1 ของการจับคู่เริ่มแรก find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core

1

เอาล่ะฉันได้พบคำตอบเพื่อจำลองการค้นหาที่ซ้อนกันนี้:

find X/ -type d | grep "/inc/" > list

เยี่ยมมากนั่นก็ใช้ได้เหมือนกัน! อย่างไรก็ตามในเปลือกหอย Unix / Linux, มีสิ่งจริงๆไม่มีเช่นคำตอบ มันเป็นส่วนผสมของความชอบส่วนตัวและสิ่งที่ง่ายต่อการติดตาม
Vishal Kotcherlakota

เพื่อดูแลชื่อไฟล์ที่ไม่เป็นทางการ (แต่มีอยู่) ด้วยเช่นการขึ้นบรรทัดใหม่: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -zยังคั่นด้วยอักขระ null แต่เอาต์พุตของมันดูเหมือนว่าจะถูกคั่นด้วย null เช่นกันดังนั้นจึงต้องผ่านxargs -0L1 echoไปเช่นไปทีละบรรทัด ) ในกรณีนี้เนื่องจากคุณกำลังบันทึกรายการไปยังไฟล์โดยทุกรายการคั่นด้วยบรรทัดใหม่บรรทัดใหม่ในชื่อไฟล์จะยังคงแสดงอย่างคลุมเครือ บางทีคุณอาจไม่ต้องการไฟล์ระดับกลางขึ้นอยู่กับว่าคุณต้องการทำอะไรกับรายการ
Daniel Andersson

1

ลองสิ่งนี้:

   find path-of-x -path '*/inc/*' -type d > list

ฉันไม่ได้มีเครื่องลินุกซ์ที่จะทดสอบได้ในขณะนี้ ...
เจ้าชายจอห์นเวสลีย์

มันใช้งานไม่ได้ แต่ต้องขอบคุณสำหรับการแนะนำฉัน"\inc\":)
iammilind

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