GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menjalankan banyak perintah saat menggunakan find?

Dalam demonstrasi ini, saya akan menggunakan sh -c 'echo first; false' (atau true ) untuk -exec pertama . Itu akan memberikan beberapa keluaran dan juga memiliki efek kode keluar yang dipilih. Lalu echo second akan digunakan untuk yang kedua. Asumsikan ada satu file di direktori saat ini.

$ find . -type f -exec sh -c 'echo first; false' \; -exec echo second \;
first
$ find . -type f -exec sh -c 'echo first; true' \; -exec echo second \;
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second
$ find . -type f \( -exec sh -c 'echo first; false' \; -false -o -exec echo second \; \)
first
second

Perintah sebenarnya dari jenis ini akan terlihat seperti:

find . -type f \( -exec command1 \; -false -o -exec command2 \; \)

Di set kedua, tanda kurung yang di-escape mengelompokkan dua -exec klausa. -false di antara mereka memaksa status pengujian menjadi "false" dan -o menyebabkan ekspresi berikutnya (-exec kedua ) untuk dievaluasi karena -false .

Dari man find :

ekspr1 eksr2
Dua ekspresi berturut-turut diambil untuk digabungkan dengan "dan" yang tersirat; expr2 tidak dievaluasi jika expr1 salah.

expr1 -a expr2
Sama seperti expr1 expr2.

expr1 -o expr2
Atau; expr2 tidak dievaluasi jika expr1 benar.


Jika Anda tidak peduli tentang cmd1 dapat mencegah cmd2 dijalankan karena kode kesalahan 0 :

find . -exec cmd1 \; -exec cmd2 \;

Satu-satunya cara yang dapat diandalkan agar kedua perintah selalu dijalankan adalah dengan memiliki find memanggil shell yang selanjutnya akan menjalankan perintah secara berurutan:

find . -exec bash -c 'cmd1; cmd2' filedumper {} \;

Jika Anda tidak keberatan membuat skrip yang menjalankan cmd1 dan cmd2, hanya ini:

find . -exec myscript {} \;

atau

find . -exec myscript {} +

Menggunakan \; atau + bergantung pada apakah skrip saya dapat menangani lebih dari satu file sekaligus (menjadi sulit jika ada spasi di nama file, dll).

Menempatkan apa yang Anda lakukan dalam naskah, menurut pengalaman saya, hampir selalu sepadan. Jika Anda harus melakukannya sekali, Anda harus melakukannya lagi.

Tapi trik yang rapi adalah dengan meletakkan temuan di dalam skrip:

if [ $# -gt 0 ]; then
    for each; do
        touch $each
    done
else
    find . -exec $0 {} +
fi

Kemudian myscript bekerja pada file apa pun yang Anda berikan sebagai argumen agar dapat bekerja, tetapi jika Anda tidak memberikan argumen apa pun, ia akan menjalankan find dari direktori saat ini, dan kemudian memanggil dirinya sendiri pada file yang ditemukan. Ini menyiasati fakta bahwa find -exec tidak dapat memanggil fungsi shell yang telah Anda tetapkan dalam skrip Anda.


Linux
  1. Bagaimana Cara Mengirim Stdout Ke Beberapa Perintah?

  2. Bagaimana Cara Mengganti Nama Banyak File Menggunakan Find?

  3. Cara Mengkonfigurasi Nginx untuk Mengeksekusi PHP Menggunakan PHP-FPM

  1. Linux – Bagaimana Menemukan Proses Menggunakan Port Serial?

  2. temukan dan salin file menggunakan Bash

  3. Cara menyalin banyak file secara bersamaan menggunakan scp

  1. Bagaimana Menemukan Banyak String Dalam File??

  2. Bagaimana Mengeksekusi Perintah Di Gnuplot Menggunakan Script Shell?

  3. Tutorial Unix Sed:Cara Mengeksekusi Beberapa Perintah Sed