Как выполнить sed оперативную замену, которая только создает резервные копии файлов, которые были изменены?

Можно приостановить любую программу путем отправки ему a TSTP (вежливый) или STOP (насильственный) сигнал. На терминале Вы работали rsync в, нажатие Ctrl+Z отправляет TSTP. Резюме с fg или bg команда в терминале или a CONT сигнал.

Безопасно уничтожить процесс rsync и выполнить все это снова; это продолжится, где это кончило. Это может быть немного неэффективно, особенно если Вы не передали --partial (включенный в -P), потому что rsync проверит все файлы снова и обработает файл, на котором это было прервано с нуля.

Могут быть необычные комбинации опций, которые приведут к некоторым файлам, не синхронизируемым правильно, возможно --inplace с чем-то еще, но я думаю, что никакая единственная опция не вызовет это.

Если Вы разъединяете свой ноутбук и повторно подключаете его где-то в другом месте, это может получить другой IP-адрес. Затем соединение TCP, используемое rsync, было бы разъединено, таким образом, необходимо будет уничтожить его и запуститься снова. Это может также произойти, если Вы приостанавливаете свой ноутбук, и соединение TCP испытывает таймаут. Тайм-аут в конечном счете отфильтрует к прикладному уровню, но он может требовать времени. Безопасно нажать Ctrl+C и выполнить rsync снова.

13
21.11.2011, 04:53
4 ответа

Вы могли проверить содержание файлов, чтобы удостовериться, что замена произойдет когда sed воздействует на них:

find . \
    -type f \
    -exec grep -q 'Ms. Johnson' {} \; \
    -print0 |
xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

Если Вы хотите быть действительно умными об этом, Вы могли бы предшествовать использованию find вообще:

grep -Z -l -r 'Ms. Johnson' |
    xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'
6
27.01.2020, 19:53
  • 1
    я думаю, что Вам нужен a '{}' незадолго до Вашего \; в этом -exec. –  Jander 21.11.2011, 05:13

Найдите имеет -exec оператор, который выполняет произвольную команду. Еще лучше, -exec тест, таким образом, можно объединить несколько в цепочку -execs вместе, и если более ранние команды перестали работать, более поздние не будут выполняться. Строка {} заменяется текущим именем файла, и ; отмечает конец команды. Необходимо заключить обоим в кавычки для предотвращения вмешательства оболочки.

Так:

find . -type f \
    -exec grep -q 'Ms. Johnson' '{}' \; \
    -exec sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g' '{}' \;
8
27.01.2020, 19:53
  • 1
    у меня никогда не было проблемы с помощью пустого {}'s. –  amphetamachine 21.11.2011, 05:14
  • 2
    @amphetamachine: Я тоже, но страница справочника предлагает это. Это могла быть csh вещь, или могли бы быть оболочки (не Bash и не POSIX), кто расширяется {} к пустой строке при выполнении расширения фигурной скобки. –  Jander 21.11.2011, 07:16

Я посмотрел на страницу справочника и не видел способа сделать это непосредственно через sed, поскольку я уверен, что Вы сделали перед выяснением. Я вижу несколько способов работать вокруг этого использования grep, но я думаю, что самое легкое является этим:

grep -rlZ "Ms. Johnson" . | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

-r рекурсивно вызвать
-l распечатайте имя файла только
-Z закончите имена пустым указателем

4
27.01.2020, 19:53

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

search="test"
for match in $(find -type f -exec grep -l $search "{}" \;)
do sed -i'.bup' -e "/$search/ s/$search/Mrs. Melbin/g" "$match"
done
-1
27.01.2020, 19:53
  • 1
    Вы забыли . как первый аргумент find. Кроме того, поскольку мне сообщили самому не слишком долго назад, Вы не должны на самом деле заключить в кавычки или выйти {} –  Kevin 21.11.2011, 05:18
  • 2
    Не генерируйте список файлов и выполняйте замену команды относительно этого. Сначала find генерирует разделенный от новой строки список файлов, затем оболочка разбивает этот список в любом пробеле (не только новые строки), и затем оболочка рассматривает каждое слово как шаблон шарика. Это только работает, если Ваши имена файлов не содержат пробел или \[?*. Другие ответы на этой странице показывают, как сделать это правильно. –  Gilles 'SO- stop being evil' 22.11.2011, 01:15
  • 3
    @Kevin . является ненужным с находкой (по крайней мере, находят найденными на Linux), потому что принято, когда никакой путь не передается аргумент. скалы –  laebshade 22.11.2011, 01:48

Теги

Похожие вопросы