Возможно, необходимо использовать -E
опция (или -r
как объяснено на руководстве) для хранения совместимости с GNU Sed. В Вашем случае Вы могли установить Гну Sed, если Вы привыкли к нему (порт gsed на FreeBSD), или это приложит долгие усилия для портирования сценариев.
И помните. Если некоторая команда на BSD не действует как версия гну той утилиты, это не означает, что это повреждается ;)
Я предполагаю, что вы изменили исходный код в одном из ваших исходных файлов на одном из ваших серверов и хотите портировать исправления на другие веб-сайты, верно? Если вы сохранили копию Orginial File (я всегда делаю, когда я не знаю проекта по сердцу), используйте свой лучший актив: diff
:
diff -Nau old/file new/file > file.patch
У вас будет дифференциал между оригиналом и Исправленные исходные файлы, которые вы можете исправить все свои серверы с помощью SSH, например:
# See what's to be done, no action
cat file.patch | ssh server "patch -d <directory> --dry-run"
# Apply the patch if all seems good
cat file.patch | ssh server "patch -d <directory>"
Возможно, вам придется настроить заголовок патча, если ваша неизменная копия находится в другом каталоге, чем исправленный файл. Но в основном, если оба находятся в одном каталоге, File.php
Быть фиксированным файлом и File.php.orig
Оригинал, CD
К корневой каталоге вашего веб-сайта и запустите команду diff
, например:
cd /home/www/htdocs/www.mysite.tld
diff -Nau some/deep/dir/file.orig.php some/deep/dir/file.php > /tmp/file.patch
из корневого каталога других веб-сайтов:
# See what's to be done, no action
patch -d /home/www/htdocs/www.my.other.site.tld --dry-run < /tmp/file.patch
# Apply the patch if all seems good
patch -d /home/www/htdocs/www.my.other.site.tld < /tmp/file.patch
Другой полезный аргумент - P
. Оба diff
и Patch
могут работать на дереве каталогов, чтобы рекурсивно применять фиксимы. Вы также можете построить более сложный патч, объединяя их в одном файле. См. Патч --help
и diff --help
Для более подробной информации о том, как их использовать.
Согласно вашему первоначальному вопросу дословно, это то, что вы хотите, но смотрите мой комментарий ниже. Вы можете попробовать сначала найти часть
самостоятельно, чтобы удостовериться, что у вас есть нужные файлы.
find /home -maxdepth 3 -mindepth 3 -path */phpthumb/filename ! -size xxxx |
xargs -t -n 1 cp /home/test/testuser/phpthumb/filename
Для того, чтобы это сработало согласно моему комментарию и заменило те, которые имеют такой же размер, просто опустите !
.
На самом деле сравнение MD5-сумм - лучший способ сделать это. Это более надежный способ, так как, возможно, один из ваших настраиваемых файлов будет иметь одинаковый размер. Вы можете попробовать:
original_md5=$(md5sum /path/to/original | awk '{print $1}')
echo /home/*/*/phpthumb/filename |
xargs md5sum |
grep "^$original_md5" |
awk '{print $2}' |
xargs -t -n 1 cp /home/test/testuser/phpthumb/filename
Это для того, чтобы заменить все файлы, соответствующие оригиналу. Чтобы сделать это в соответствии с вашим вопросом дословно, добавьте опцию -v
в grep
. Обратите внимание, что ни один из этих ответов не сработает, если в любом из путей поиска есть пробелы (на тот случай, если они были добавлены с момента последнего вопроса).