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/myFileuntuk menimpa setiap hasil yang dikembalikan olehfindke; 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.