Я запускаю эту команду, чтобы найти и заменить все вхождения «apple» на «orange» во всех файлах в корне моего сайта:
find ./ -exec sed -i 's/apple/orange/g' {} \;
Но это не проходит через подкаталоги.
Что не так с этой командой?
Вот некоторые строки вывода find ./
:
./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php
find ./
и опубликовать пример вывода? И каталог структуры, пожалуйста. редактировать: спасибо!Ответы:
Ваша находка должна выглядеть так, чтобы избежать отправки имен каталогов в sed:
источник
sed -i 's/apple/orange/g'
чтобыsed -i '' 's/apple/orange/g'
сделать эту работу.-i
принимает аргумент: расширение, используемое для сохранения временного файла. В GNU sed, похоже, между пробелом-i
и его аргументом нет пробела , но в BSD sed есть… поэтому BSD-i '' 's/foo/bar/'
эквивалентен GNU-i 's/foo/bar/
.-e
не работает на Mac OS.touch a b c d e
затем выше команда выдает список каталогов , как это:a a-e b b-e c c-e d d-e e e-e
.RE error: illegal byte sequence
'{}'
, потому что рыба автоматически расширяет пустые скобки, если не заключена в кавычки.Для больших задач s & r лучше и быстрее использовать grep и xargs, например;
источник
git grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
Это сработало для меня:
источник
*.php
действительно неправильно; вам просто повезло, что он не раскрылся в начальном каталоге, потому что у вас там не было подходящих файлов.источник
Так как есть пользователи MacOS, которые читают этот (как я), следующий код работал для меня (10.14)
Все остальные ответы с использованием
-i
и-e
не работают на macOS.Источник
источник
Я думаю, что мы можем сделать это одной простой командой
Обратитесь к этой странице .
источник
В linuxOS:
если "седь" не работает, попробуйте:
источник