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

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' {} \;

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'

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 {} \;

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|"

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


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 .


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.