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 eksplisitmyFile
-exec
:untuk hasil pencarian, lakukan perintah tambahan dengan merekacp /home/myuser/myFile {}
:menyalin/home/myuser/myFile
untuk menimpa setiap hasil yang dikembalikan olehfind
ke; pikirkan{}
ke mana setiap hasil pencarian pergi.';'
:digunakan untuk memisahkan perintah yang berbeda untuk dijalankan setelahfind
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.