
У меня большой набор файлов, в которых мне нужно заменить полную схему URL. Некоторые имена файлов содержат пробелы. После долгих поисков, риалов и ошибок, вот самое близкое, что я нашел:
find /somedir -type f -print0 -exec sed -i'' -e 's#http\\:\\/\\/domain.com#https\\:\\/\\/www.domain.com#g' {} +
В полученном файле схема http:
удалена, оставлено //
- например, '//www.domain.com'
Кроме того, создается НОВЫЙ файл, добавляемый -e
к имени файла. - т.е. some file.php-e
что явно нежелательно.
Хотя этого, безусловно, было бы достаточно (после удаления файлов) *-e
, мое внутреннее ОКР действительно хочет знать, как это сделать правильно. Примечание: я работаю локально на Mac, но также буду выполнять это на Linux.
Любые идеи будут высоко оценены!
решение1
Решение 1: Один из способов — использовать find
с xargs
:
find /dir -type f -print0 | xargs -0 sed -i 's#http://domain.com#https://www.domain.com#g'
Решение 2: Другой вариант — использовать find
с -exec
, очень похоже на то, что в вашем вопросе:
find /dir -type f -exec sed -i 's#http://domain.com#https://www.domain.com#g' {} +
Оба решения будут вызываться sed
с несколькими файлами в качестве аргументов. Поэтому sed
вызывается не один раз для каждого файла, а для каждого набора файлов.
Решение 3: Вместо sed
, вы также можете использовать perl
для поиска-замены-задания:
perl -i -pe 's#http://domain.com#https://www.domain.com#g' file
В сочетании с командой find
/ xargs
:
find /dir -type f -print0 | xargs -0 perl -i -pe 's#http://domain.com#https://www.domain.com#g'