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?

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.


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.


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.