Temukan dan ganti dengan direktori direktori dan sub direktori

244

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
hd.
sumber
dapatkah Anda menjalankan find ./dan memposting beberapa sampel output? Dan direktori strucuture tolong. sunting: terima kasih!
Yakub
Hm temuan Anda benar, bekerja untuk saya dengan subdir.
Yakub
1
Bagaimana Anda tahu itu tidak memproses subdirektori?
carlpett
karena memberikan kesalahan ini: sed: tidak dapat mengedit ./fpd: bukan file biasa sed: tidak dapat mengedit ./fpd/font: bukan file biasa: tidak dapat mengedit ./fpd/font/makefont: bukan peraturan
hd.
oh ... saya ambil apel dan tidak ada yang ditemukan. Mereka semua diganti. ;) Terima kasih . Anda membuka mata saya !!!
hd.

Jawaban:

421

Temuan Anda akan terlihat seperti itu untuk menghindari pengiriman nama direktori ke:

find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \;
jfg956
sumber
19
Anda mungkin perlu mengubah sed -i 's/apple/orange/g'untuk sed -i '' 's/apple/orange/g'membuat karya ini.
paulmelnikow
7
-imengambil argumen: ekstensi yang digunakan untuk menyimpan file sementara. Di GNU sed, sepertinya tidak ada ruang di antara -idan argumennya, tetapi di BSD sed ada ... jadi BSD -i '' 's/foo/bar/'setara dengan GNU -i 's/foo/bar/.
paulmelnikow
20
Sebenarnya menambahkan -etidak berfungsi di Mac OS. touch a b c d ediikuti oleh perintah diatas menghasilkan daftar direktori seperti ini: a a-e b b-e c c-e d d-e e e-e.
paulmelnikow
6
Untuk Mac OS, ini menjawab stackoverflow.com/questions/19242275/... theRE error: illegal byte sequence
kakoma
3
Untuk pengguna kerang ikan, pastikan untuk mengutip kawat gigi yang kosong '{}', karena ikan secara otomatis memperluas kawat gigi yang kosong jika tidak dikutip.
Kevin Cherepski
84

Untuk tugas s & r yang lebih besar, lebih baik dan lebih cepat menggunakan grep dan xargs, jadi, misalnya;

grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g'
Julius
sumber
20
Terima kasih atas jawaban ini, itu sangat membantu! Jika dalam repositori git, itu lebih cepat menggunakangit grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
mrodrigues
4

Ini bekerja untuk saya:

find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \;
blackdad
sumber
pertanyaan asli tidak terbatas pada file * .php, ada juga .ini
knocte
Tanda kutip *.phpbenar-benar salah; Anda baru saja beruntung bahwa itu tidak diperluas di direktori awal karena Anda tidak memiliki file yang cocok di sana.
tripleee
3
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"
rocLv
sumber
1

Karena ada juga orang-orang macOS membaca ini (seperti yang saya lakukan), kode berikut bekerja untuk saya (pada 10.14)

egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @

Semua jawaban lain menggunakan -idan -etidak berfungsi pada macOS.

Sumber

pat-s
sumber
0

Saya pikir kita bisa melakukan ini dengan satu perintah baris sederhana

for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done

Lihat halaman ini .

Sukrant
sumber
-6

Di linuxOS:

sed -i 's/textSerch/textReplace/g' namefile

jika "sed" tidak berfungsi coba:

perl -i -pe 's/textSerch/textReplace/g' namefile
ฉัตร ชัย สิทธิ วง ค์
sumber
4
dia ingin menemukan semua file di sub direktori berisi string itu dan ganti, tidak hanya satu file
phuclv