Saya menjalankan perintah ini untuk menemukan dan mengganti semua kemunculan 'apel' dengan 'oranye' di semua file di root situs saya:
find ./ -exec sed -i 's/apple/orange/g' {} \;
Tetapi tidak melalui sub direktori.
Apa yang salah dengan perintah ini?
Berikut adalah beberapa jalur output find ./
:
./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php
find ./
dan memposting beberapa sampel output? Dan direktori strucuture tolong. sunting: terima kasih!Jawaban:
Temuan Anda akan terlihat seperti itu untuk menghindari pengiriman nama direktori ke:
sumber
sed -i 's/apple/orange/g'
untuksed -i '' 's/apple/orange/g'
membuat karya ini.-i
mengambil argumen: ekstensi yang digunakan untuk menyimpan file sementara. Di GNU sed, sepertinya tidak ada ruang di antara-i
dan argumennya, tetapi di BSD sed ada ... jadi BSD-i '' 's/foo/bar/'
setara dengan GNU-i 's/foo/bar/
.-e
tidak berfungsi di Mac OS.touch a b c d e
diikuti oleh perintah diatas menghasilkan daftar direktori seperti ini:a a-e b b-e c c-e d d-e e e-e
.RE error: illegal byte sequence
'{}'
, karena ikan secara otomatis memperluas kawat gigi yang kosong jika tidak dikutip.Untuk tugas s & r yang lebih besar, lebih baik dan lebih cepat menggunakan grep dan xargs, jadi, misalnya;
sumber
git grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
Ini bekerja untuk saya:
sumber
*.php
benar-benar salah; Anda baru saja beruntung bahwa itu tidak diperluas di direktori awal karena Anda tidak memiliki file yang cocok di sana.sumber
Karena ada juga orang-orang macOS membaca ini (seperti yang saya lakukan), kode berikut bekerja untuk saya (pada 10.14)
Semua jawaban lain menggunakan
-i
dan-e
tidak berfungsi pada macOS.Sumber
sumber
Saya pikir kita bisa melakukan ini dengan satu perintah baris sederhana
Lihat halaman ini .
sumber
Di linuxOS:
jika "sed" tidak berfungsi coba:
sumber