Saya mencoba menggunakan find -exec dengan banyak perintah tanpa hasil. Adakah yang tahu jika perintah seperti berikut ini dimungkinkan?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
Pada dasarnya, saya mencoba untuk mencetak baris terakhir dari setiap file txt di direktori saat ini dan mencetak di akhir baris, koma diikuti oleh nama file.
find
halaman manual:There are unavoidable security problems surrounding use of the -exec option; you should use the -execdir option instead.
unixhelp.ed.ac.uk/CGI/man-cgi?findJawaban:
find
menerima beberapa-exec
bagian dari perintah. Sebagai contoh:Perhatikan bahwa dalam kasus ini perintah kedua hanya akan berjalan jika yang pertama kembali dengan sukses, seperti yang disebutkan oleh @Caleb. Jika Anda ingin kedua perintah dijalankan terlepas dari keberhasilan atau kegagalannya, Anda bisa menggunakan konstruk ini:
sumber
-n
di beberapa jawaban lain untuk menekan baris baru yang dihasilkan oleh gema, yang berguna jika perintah kedua Anda hanya menghasilkan satu baris output dan Anda ingin mereka lebih mudah dibaca.sumber
... -exec bash -c ...
bukan... -exec sh -c ...
.{}
kode shell. Lihat unix.stackexchange.com/questions/156008/…Satu dari berikut:
sumber
$0
. Coba ini dengan "foobar" bukan "_":find /usr/bin -name find -exec sh -c 'echo "[$0] [$1]"' foobar {} \;
- output: "[foobar] [/ usr / bin / find]".$0
biasanya nama program (ARGV[0]
).sh -c
adalah dalam tanda kutip tunggal, bukan ganda. Kalau tidak,$1
ada dalam ruang lingkup yang salah.'$1'
dengan tanda kutip ganda selama Anda lolos dari variabel ("\$1"
). Anda dapat keluar dari karakter lain juga ("\""
).Cara lain adalah seperti ini:
dalam satu baris
multiple_cmd()
" - adalah sebuah fungsiexport -f multiple_cmd
" - akan mengekspornya sehingga subkulit lain dapat melihatnyafind *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
" - temukan yang akan menjalankan fungsi pada contoh AndaDengan cara ini multiple_cmd dapat menjadi panjang dan kompleks, seperti yang Anda butuhkan.
Semoga ini membantu.
sumber
~/aaa$ acmd() { echo x \"$1\" x; }; export -f acmd; find . -exec bash -c 'acmd {}' \;
Ada cara yang lebih mudah:
Kalau tidak:
sumber
zcat $file | wc -l
"; selesai tidak bekerja, jadi terima kasih!`
untuk melakukan itu Anda menggunakan backslash seperti:\`
(masih, itu alasan lain yang baik untuk digunakan$()
sebagai gantinya).Saya tidak tahu apakah Anda bisa melakukan ini dengan find, tetapi solusi alternatifnya adalah membuat skrip shell dan menjalankannya dengan find.
lastline.sh:
Jadikan skrip dapat dieksekusi
Gunakan
find
:sumber
Jawaban pertama Denis adalah jawaban untuk menyelesaikan masalah. Tetapi sebenarnya itu tidak lebih menemukan dengan beberapa perintah hanya dalam satu exec seperti judulnya. Untuk menjawab satu eksekutif dengan beberapa perintah, kita harus mencari sesuatu yang lain untuk diselesaikan. Berikut ini sebuah contoh:
Menyimpan 10.000 baris terakhir file .log yang telah dimodifikasi dalam 7 hari terakhir menggunakan 1 perintah exec menggunakan beberapa {} referensi
1) lihat apa yang akan dilakukan perintah pada file mana:
2) Lakukan: (perhatikan tidak ada lagi "\>" tetapi hanya ">" ini yang diinginkan)
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;
sumber
Berkat Camilo Martin, saya bisa menjawab pertanyaan terkait:
Yang ingin saya lakukan adalah
yang tidak berhasil. Namun,
berhasil, jadi terima kasih!
sumber
Memperluas jawaban Tinker,
Dalam kasus saya, saya perlu membuat bagian
command | command | command
dalam-exec
untuk mencetak nama file dan teks yang ditemukan dalam file yang mengandung teks tertentu.Saya bisa melakukannya dengan:
hasilnya adalah:
sumber
/dev/null
sebagai argumen kedua kegrep
perintah dengan satu-exec
parameter:find . -name config -type f -exec grep "bitbucket" {} /dev/null \;
harus menggunakan xargs :)
satu lagi (bekerja di osx)
sumber
find
- situasi di mana jumlah file yang cocok terlalu besar untuk baris perintah.-exec
adalah cara untuk melewati batas ini. Menyalurkan ke utilitas melewatkan manfaat itu.xargs -n
ada untuk memilih jumlah kecocokan per doa.xargs -n 1 foocmd
akan mengeksekusifoocmd {}
untuk setiap pertandingan.Sebuah
find+xargs
jawaban.Contoh di bawah ini menemukan semua
.html
file dan membuat salinan dengan.BAK
ekstensi yang ditambahkan (misalnya1.html
>1.html.BAK
).Perintah tunggal dengan beberapa tempat penampung
Banyak perintah dengan beberapa tempat penampung
Perintah ini juga akan bekerja dengan file yang dimulai dengan tanda hubung atau berisi spasi seperti
-my file.html
terima kasih kepada parameter mengutip dan--
setelahcp
itu memberi sinyal kecp
akhir parameter dan awal nama file yang sebenarnya.sumber