Bagaimana Anda menampilkan nama file dalam perintah find saat menggunakan -exec?

33

Saya menggunakan baris berikut untuk menemukan semua sub-direktori dari PWD dan dijalankan svnadmin verifypada setiap direktori (saya sudah tahu bahwa itu adalah repositori Subversion)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

Ini berfungsi dengan baik, selain fakta bahwa outputnya terlihat seperti ini:

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

Saya benar-benar ingin findmencetak nama file sebelum mengeksekusi svnadmin verifyperintah, untuk membuat logging lebih mudah.

Saya sudah mencoba memerasnya sedikit lsdi sana tetapi memperbaikinya, bagaimana saya harus melakukan ini (lebih baik sederhana)?

Arronikal
sumber

Jawaban:

36

cukup tambahkan -printfopsi sebelumnya

find -printf '%p' -exec command \;
Fiximan
sumber
4
Indah, aku berubah '%p'ke '%p\n'sehingga mendahului nama memverifikasi keluaran pada baris itu sendiri.
Arronical
17
@Arronical jika itu format yang Anda inginkan, Anda dapat mengganti (diformat) -printf '%p\n'dengan yang lebih sederhana-print
steeldriver
4
find -name <a_name> -print -exec command {} \;
toliveira
14

Jika Anda tidak ingin berulang, tidak ada gunanya menggunakan find. Jauh lebih mudah untuk melakukannya di shell secara langsung:

for d in */; do echo "$d"; svnadmin verify "$d"; done

The for d in */akan menemukan semua direktori (yang */memastikan hanya direktori dan tidak ada file yang ditemukan); yang echo "$d"akan mencetak nama direktori ini; yang svnadmin verify "$d"akan memeriksa direktori.

Ini bisa dijalankan langsung dari baris perintah atau dari dalam skrip tanpa perubahan format.

terdon
sumber
1
Ini memang terlihat seperti cara yang lebih baik untuk mencapai tujuan saya, tetapi saya harus memberikan jawaban kepada Fiximan hanya karena judul dan referensi pertanyaan saya findsangat banyak. Terima kasih telah meningkatkan pengetahuan saya!
Arronical
Ini membutuhkan menggunakan bola. Gumpalan jelas berguna & kuat, tetapi dalam pengalaman pribadi saya, sintaksisnya lebih sulit untuk dibuat, dan seringkali membutuhkan hal-hal lain seperti dotglobdan globstardalam bash, yang menciptakan skrip yang lebih panjang, lebih rumit. Saya cenderung menyimpan gumpalan untuk tugas-tugas besar yang rumit, sementara findsintaksis lebih mudah untuk dilempar bersama dengan hanya merangkai sekelompok filter dan perintah ke dalam satu-liner.
user5359531
@ user5359531 baik globstar maupun dotglob (kecuali Anda tahu Anda memiliki file tersembunyi dan benar-benar menginginkannya) diperlukan di sini. Ini jelas masalah pendapat tetapi Anda adalah orang pertama yang pernah saya temui yang menganggap format agak findsederhana yang lebih sederhana. Saya selalu lebih suka gumpalan daripada findkarena saya tidak hanya menemukan mereka jauh lebih sederhana tetapi mereka juga lebih aman ketika berhadapan dengan nama file sewenang-wenang yang diteruskan ke program lain.
terdon
6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

Saya telah menambahkan -type djika hanya direktori.

7171u
sumber
Saya kutip {}, setidaknya dalamsvnadmin verify {}
kos
Terima kasih atas tanggapan cepatnya. Jadi dalam perintah ini apakah -execmenelurkan shell anak, di mana 2 perintah dijalankan, menggunakan ;sebagai ujung baris?
Arronical
5

Coba ini:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

Jika Anda hanya ingin direktori (Terima kasih kepada @kos note):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done
Maythux
sumber
Bagus, tetapi ini juga akan memproses file: for f in */hanya akan memproses direktori
kos
Apakah ini hanya akan berfungsi dalam skrip? Atau bisakah saya mengeluarkannya di baris perintah?
Arronical
1
@Arronical akan bekerja juga sebagai command line
Maythux
2
  • Gunakan . -maxdepth 1alih-alih ./*, Anda hanya perlu level pertama dalam struktur folder
  • Gunakan -type d, Anda hanya perlu folder
  • Gunakan ! -name ".", Anda tidak perlu.
  • Gunakan -execuntuk memulai shell
  • Gunakan sh -cuntuk memulai perintah di dalam shell

Perintahmu

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

atau lebih pendek

  • Gunakan -prunejika file tersebut adalah direktori, jangan turun ke dalamnya

Perintahmu

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 
AB
sumber
-pruneterlihat menarik. Saya biasa ./* -maxdepth 0menghindari kembali .dari perintah find. Itu tidak menyebabkan kesalahan kritis, tapi saya lebih suka tidak memiliki itu di output saya.
Arronical
1

findmemiliki flag opsi untuk dicetak, yang sudah disebutkan dalam jawaban lain. Jika kita melihat masalah dari perspektif menjalankan beberapa perintah untuk file yang sedang diproses yang sama, findmemungkinkan untuk menggunakan banyak perintah-exec pernyataan. Ini berarti kami dapat memilih untuk menggunakan:

find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; 

Sekali lagi, perhatikan bahwa pendekatan ini berlaku untuk tidak hanya mencetak dengan echo, printfatau utilitas lain, tetapi juga perintah lain.

Sergiy Kolodyazhnyy
sumber
0

Mungkin bermanfaat untuk menyalurkan findoutput ke readloop:

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

Ini memungkinkan Anda untuk mengeksekusi urutan perintah majemuk yang lebih rumit dengan nama file yang dikembalikan oleh find, seperti dalam lscontoh mewah ini :

find . | while read f; do echo ${f} | figlet -k; done
Ves
sumber
-1

Ini akan mencetak nama dan isi file-hanya secara rekursif ..

find . -type f -printf '\n\n%p:\n' -exec cat {} \;
Prashant Adlinge
sumber