GNU/Linux >> Belajar Linux >  >> Linux

Keluaran perintah Linux sebagai parameter dari perintah lain

Inilah yang Anda inginkan:

find . -name myFile -exec cp /home/myuser/myFile {} ';'

Perincian / penjelasan tentang ini:

  • find :memanggil perintah find
  • . :memulai pencarian dari direktori kerja saat ini.
  • Karena tidak ada flag kedalaman yang ditentukan, ini akan mencari semua subfolder secara rekursif
  • -name myFile :temukan file dengan nama eksplisit myFile
  • -exec :untuk hasil pencarian, lakukan perintah tambahan dengan mereka
  • cp /home/myuser/myFile {} :menyalin /home/myuser/myFile untuk menimpa setiap hasil yang dikembalikan oleh find ke; pikirkan {} ke mana setiap hasil pencarian pergi.
  • ';' :digunakan untuk memisahkan perintah yang berbeda untuk dijalankan setelah find

Ada beberapa cara untuk mengatasi ini, bergantung pada apakah Anda perlu mengkhawatirkan file dengan spasi atau karakter khusus lainnya di namanya.

Jika tidak ada nama file yang memiliki spasi atau karakter khusus (hanya terdiri dari huruf, angka, tanda hubung, dan garis bawah), maka berikut ini adalah solusi sederhana yang akan berfungsi. Anda dapat menggunakan $(command) untuk mengeksekusi perintah, dan mengganti hasilnya menjadi argumen dari perintah lain. Shell akan membagi hasilnya menjadi spasi, tab, atau baris baru, dan for tetapkan setiap nilai ke $f pada gilirannya, dan jalankan perintah pada setiap nilai.

for f in $(find . -name myFile)
do
    cp something $f
done

Jika Anda memiliki spasi atau tab, Anda dapat menggunakan -exec find pilihan. Anda lulus -exec command args , menempatkan {} di mana Anda ingin mengganti nama file, dan mengakhiri argumen dengan ; . Anda perlu mengutip {} dan ; sehingga shell tidak menafsirkannya.

find . -name myFile -exec cp something "{}" \;

Terkadang -exec Tidak cukup. Misalnya, dalam pertanyaan ini, mereka ingin menggunakan ekspansi parameter Bash untuk menghitung nama file. Untuk melakukannya, Anda harus meneruskan -exec bash -c 'your command' , tetapi kemudian Anda akan mengalami masalah mengutip dengan {} pengganti. Untuk mengatasinya, Anda dapat menggunakan -print0 dari find untuk mencetak hasil yang dibatasi dengan karakter null (yang tidak valid dalam nama file), dan menyalurkannya ke while read loop yang membagi parameter menjadi nol:

find . -name myFile -print0 | (while read -d $'\0' f; do
    cp something "$f"
  done)

Pipa akan mengirimkan output dari satu program ke input program lainnya. cp tidak membaca dari aliran masukannya di terminal, ia hanya menggunakan argumen pada baris perintah.

Anda ingin menggunakan xargs dengan pipa atau find exec argumen, bukan pipa.

find . -name myFile 2>&1 | xargs -I {} cp /home/myuser/myFile {}

Catatan:opsi -I {} mendefinisikan {} sebagai placeholder, Anda juga dapat menggunakan placeholder lain jika bertentangan dengan perintah yang akan dijalankan.


Linux
  1. Cara Menetapkan Output dari Perintah Linux ke Variabel

  2. 25 contoh sederhana perintah find Linux

  3. temukan Contoh Perintah di Linux

  1. Cara Menyimpan Output Perintah ke File di Linux

  2. Perintah mv Linux

  3. Linux du perintah

  1. Contoh Perintah Waktu Linux

  2. Contoh Perintah tee di Linux

  3. Linux temukan perintah - tunjukkan kemajuan