Menemukan subdirektori di dalam semua direktori dengan nama yang sama

8

Saya ingin menjalankan perintah ke:

  1. Temukan semua direktori dengan nama " inc" di bawah folder " X".
  2. Daftar semua subdirektori di bawah setiap " X/.../inc/".
  3. Redirect output ke file bernama " list"

Saya mencoba berbagai kombinasi perintah di bawah ini, tetapi tidak berhasil:

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

Bagaimana saya bisa melakukan ini?

iammilind
sumber

Jawaban:

13

find dapat melakukan ini dengan sendirinya:

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

Baca -pathbagian man finduntuk info lebih lanjut.

Seperti yang saya sebutkan dengan cepat dalam komentar: jika Anda menyimpan baris direktori yang dipisahkan dalam file teks, nama direktori yang mengandung baris baru tidak akan dapat direpresentasikan secara jelas. Jika Anda yakin direktori tidak mengandung baris baru, tidak apa-apa. Hanya komentar umum.

Daniel Andersson
sumber
ya. Saya memberikan jawaban yang sama di sini
Pangeran John Wesley
Atau cari X -name 'inc' -type d> list
MaQleod
@ MAQleod: Tidak, bukan itu pertanyaannya.
Daniel Andersson
4

Berikut ini adalah one-liner yang berguna:

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

Ini berjalan findpada setiap findhasil pertama . The execpilihan juga dapat mengambil perintah shell minimal, di mana - seperti yang saya katakan - {}diganti dengan setiap direktori yang pertama find.

Yang kedua findakan, sesuai permintaan Anda, "daftar semua subdirektori" dari hasil pertama, termasuk incdirektori. Jika Anda tidak ingin itu sendiri dalam output, biarkan folder output kedalaman find paling sedikit kedua .

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

Kami kemudian hanya akan mengarahkan perintah stdoutke list.

slhck
sumber
variasi pada jawaban itu sangat membantu saya di mana saya hanya ingin direktori sub kedalaman 1 pertandingan asli find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core
1

Baiklah saya telah menemukan jawaban untuk mensimulasikan temuan bersarang ini:

find X/ -type d | grep "/inc/" > list
iammilind
sumber
Bagus, itu juga akan berhasil! Namun, dalam kerang Unix / Linux, ada benar-benar ada hal seperti itu jawabannya. Ini adalah campuran dari preferensi pribadi dan apa yang mudah diikuti.
Vishal Kotcherlakota
Untuk menjaga nama file yang tidak konvensional (tetapi ada) dengan misalnya baris baru: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -zjuga membatasi pada karakter null, tetapi outputnya tampaknya juga dipisahkan nol, sehingga orang perlu menyalurkannya melalui mis. xargs -0L1 echoUntuk mendapatkannya baris demi baris ). Dalam hal ini, karena Anda menyimpan daftar ke file dengan setiap entri dipisahkan oleh baris baru, baris baru dalam nama file akan tetap diwakili secara ambigu. Mungkin Anda bahkan tidak memerlukan file perantara, tergantung pada apa yang ingin Anda lakukan dengan daftar.
Daniel Andersson
1

Coba ini:

   find path-of-x -path '*/inc/*' -type d > list
Pangeran John Wesley
sumber
saya tidak punya mesin linux untuk mengujinya sekarang ...
Pangeran John Wesley
Ini tidak berhasil. Tapi terima kasih telah menyarankan saya "\inc\":)
iammilind
@ iammilind: coba dengan -pathbendera
Pangeran John Wesley