Intereting Posts
/ root как привязка привязки? переименование файлов путем добавления месяца и года, определенных в отметках времени файла Как иметь хвост -f показать цветной выход Управление набором контейнеров докеров в качестве инфраструктуры Можно ли изменить приоритет файла подкачки, не отключая его? Является ли удаление Perl Рекомендацией для упрочения системы? Разрешить любому пользователю в группе предохранителей размонтировать Какой приоритет я должен дать скрипту, запущенному при запуске? Сортировка IP-адресов, связанных со строкой в ​​файле txt в linux Linux Mint занимает 18,2 Cinamon слишком много времени, чтобы отключить Показывать доработки по подсказке в Fish rlwrap -z pipeto: выход труб через пейджеры Метод установки вручную для Fedora Могут ли отдельные учетные записи unix использовать имя пользователя, но имеют отдельные пароли? Увеличивает ли размер моей арки при установке обновлений?

Найти файл, проверить размер и перезаписать, когда размер файла отличается

Сегодня я нашел небольшую ошибку в своей собственной CMS. Теперь я хочу переписать все файлы на сервере с тем же именем файла. Тем не менее, у меня есть некоторые клиенты с определенным файлом, поэтому я не могу перезаписать все файлы.

Поскольку у некоторых клиентов есть настраиваемый файл, мне нужно проверить размер файла.

Когда размер файла отличается от исходного, он должен быть перезаписан. Когда это тот же файл, он должен пропустить файл.

Несколько месяцев назад я задал вопрос немного похожим, как перезаписать несколько файлов из одного источника. Мне тоже удалось это исправить:

echo /home/*/*/phpthumb | xargs -t -n 1 cp -r /home/test/testuser/phpthumb/* 

Могу ли я использовать это в сценарии .sh с небольшим if / else для перезаписи или пропуски файла? Если да, как я могу это сделать?

Мой опыт unix является средним, поэтому, если что-то неясно о моем вопросе, не стесняйтесь спрашивать.

С уважением.

Я предполагаю, что вы изменили исходный код в одном из ваших исходных файлов на одном из ваших серверов и хотите перенести исправление на другие веб-сайты, не так ли? Если вы сохранили копию файла orginial (я всегда делаю, когда я не знаю проект наизусть), используйте свой лучший актив: 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 могут работать в дереве каталогов, чтобы реплицировать исправления. Вы также можете создать более сложный патч, объединив их в один файл. См. patch --help и diff --help для получения более подробной информации о том, как их использовать.

Согласно вашему первоначальному вопросу дословно, это то, что вы хотите, но см. Мой комментарий ниже. Сначала вы можете попробовать только часть find чтобы убедиться, что у вас есть нужные файлы.

 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 . Также обратите внимание, что ни один из этих ответов не будет работать, если в любом из путей поиска есть пробелы (на случай, если они будут добавлены с вашего последнего вопроса).