Sesuatu seperti berikut ini adalah apa yang saya cari, tetapi kode saya tidak berfungsi, tidak peduli bagaimana saya melarikan diri {}
dan+
;
find ./ -maxdepth 1 -type d -name '.*' -exec \
find {} -maxdepth 1 -type f -name '*.ini' -exec \
md5sum \{\} \\; \;
Setelah melihat ini Unix - & - pertanyaan Linux , saya menemukan bahwa karya-karya kode berikut, tetapi tidak bersarang menemukan seperti itu, dan saya menduga ada cara yang lebih baik untuk melakukan pekerjaan tertentu.
find ./ -maxdepth 1 -type d -name '.*' \
-exec bash -c 'for x; do
find "$x" -maxdepth 1 -type f -name "*.ini" \
-exec md5sum \{\} \;; \
done' _ {} \+
Apakah ada cara untuk membuat sarang find -exec
tanpa harus menggunakan shell (seperti di atas), dengan semua kutipan aneh dan kendala lolos?
Atau dapatkah ini dilakukan secara langsung dalam satu perintah find, menggunakan campuran dari banyak parameternya?
text-processing
find
filenames
Peter.O
sumber
sumber
find
, tetapi jikafind
tidak bisa melakukan ini, lalu mengapafind
begitu dihormati (?) Sebagai alat- untuk digunakan untuk mencari file? ... Saya secara subseqeuntly menemukan bahwafind ./ -maxdepth 2 -path '.*/*.ini' -type f -exec md5sum {} \+
berfungsi dengan baik dalam situasi saya (referensi jw013 untuk-prune
membawa saya ke ini di halaman manual), tapi saya bertanya-tanya apakah itu metode yang kuat (dalam genera). Saya tidak pernah benar-benar menggunakanfind
(dalam waktu kurang dari satu tahun Linux) karenalocate
telah melakukan hampir semua yang saya butuhkan, jadi itu adalah wilayah yang tidak dikenal.-path
uji persis apa yang akan saya sarankan. Dengan ini, Anda harus dapat melakukan semua yang Anda inginkan (maaf untuk asosiasi Ace Of Base;))Jawaban:
Saya akan mencoba menggunakan pencarian tunggal seperti:
atau bahkan (
find
sama sekali tidak, cukup shell globbing)walaupun ini tidak memiliki
-type f
pemeriksaan jadi hanya berfungsi jika Anda tidak memiliki direktori / non-file yang berakhiran.ini
. Jika Anda melakukannya, Anda bisa menggunakanNamun yang akan kehilangan keuntungan dari hanya membutuhkan satu doa md5sum.
Edit
Untuk metode chaining umum dan aman
find
, Anda dapat melakukan sesuatu sepertisumber
-f
(f?), Dan kemudian kesalahan lain dengan-execdir
.. Ketika saya mengganti -execdir dengan -exec, dan / atau juga mengganti md5sum dengan print, saya tidak mendapatkan apa-apa ..find
... Ini tidak terlalu banyak sehingga saya hanya ingin contoh ini diselesaikan, saya mencari wawasan tentang cara menemukan-fu .. mungkin ada lebih banyak bulu daripada fu di temukan .. (saya tidak tahu, karena saya hampir tidak pernah menggunakannya), dan ini adalah situasi pertama saya benar-benar ingin menggunakannya (untuk file gambar sebenarnya) dan Fitur -exec Saya sudah banyak mendengar tentang tampaknya tidak sekuat rep (?) menyinggung ... (+1 untuk alternatif, meskipun) .. tapifind
contoh Anda tidak bekerja (masih )find
perintah: ...find: The relative path
~ / bin 'termasuk dalam variabel lingkungan PATH, yang tidak aman dalam kombinasi dengan aksi -execdir dari find. Silakan hapus entri itu dari $ PATH` .... Jadi mungkin itu akan berhasil, tetapi saya harus mengatakan saya telah mencoba untuk menyingkirkan itu ~ / bin untuk sementara waktu sekarang ... Saya harus mengambil lebih banyak serius melihatnya ... Saya tidak tahu di mana saya telah mengaturnya ... ada ide di mana ia mungkin bersembunyi; yang~/bin
di PATH sayafind
terbaik dihargai dalam situasi yang tidak dapat dilakukan sepenuhnya dengan gumpalan, tetapi karena situasi seperti itu jarang terjadi, saya biasanya tidak perlu menemukan banyak.Masalah awal Anda tidak memerlukan panggilan menemukan secara rekursif tapi saya kira itu bukan intinya.
Saya percaya itu tidak mungkin untuk memanggil menemukan secara rekursif dengan cara yang Anda inginkan.
Yang berikut ini tidak memanggil find secara rekursif (atau bersarang, apa pun namanya), tetapi tidak bisakah Anda hanya mengambil set hasil dari temuan pertama dan memberinya makan ke yang kedua? Inilah yang akan saya lakukan secara naluriah:
Anda juga dapat menggunakan
xargs
untuk mengeksekusi temuan kedua.Memperbarui:
Saya ingin menambahkan itu karena sebagian besar utilitas UNIX mengambil beberapa argumen nama file alih-alih satu, Anda biasanya dapat menghindari
-exec
semuanya:Ketika bersarang backticks Anda hanya menambahkan garis miring terbalik
\
sebelum yang dalam.Jika kita membayangkan bahwa
md5sum
hanya membutuhkan satu argumen nama file, kita selalu dapat membungkusnya dalam satufor
lingkaran:Perhatikan bahwa ini menjadi lebih sulit jika nama file / direktori dimulai dengan
-
atau mengandung spasi yang terlibat. Utilitas UNIX tidak bermain baik dengan mereka. Dalam hal itu menambahkan./
,--
atau kutipan diperlukan.Jelas contoh asli bukan yang baik, karena kita bisa melakukan:
sumber
find
metode yang ditampilkan mendapatkan kesalahan ketika file / direktori berisi spasi ...md5sum .*/*.ini
Berfungsi dengan baik ... Saya mulai mendapatkan perasaan umum bahwa * Warren Young * berkomentar tentang hal-hal yang 'kompleks' untukfind
terjadi di awal permainan :), tapi saya berasumsifind
datang sendiri ketika tes kondisi lebih rumit, tetapi sejauh bersarang -exec, saya cukup baik menjatuhkan ide, karena tampaknya ada cara yang lebih sederhana untuk melakukannya .. (tetapi perl tidak "sederhana" bagi saya (belum) ...Setidaknya saya berhasil membuat sarang untuk menemukan perintah:
Tapi saya tidak memecahkan untuk memanggil -exec (dir) lain - panggilan dari sana.
sumber