Можно приостановить любую программу путем отправки ему a TSTP
(вежливый) или STOP
(насильственный) сигнал. На терминале Вы работали rsync
в, нажатие Ctrl+Z отправляет TSTP
. Резюме с fg
или bg
команда в терминале или a CONT
сигнал.
Безопасно уничтожить процесс rsync и выполнить все это снова; это продолжится, где это кончило. Это может быть немного неэффективно, особенно если Вы не передали --partial
(включенный в -P
), потому что rsync
проверит все файлы снова и обработает файл, на котором это было прервано с нуля.
Могут быть необычные комбинации опций, которые приведут к некоторым файлам, не синхронизируемым правильно, возможно --inplace
с чем-то еще, но я думаю, что никакая единственная опция не вызовет это.
Если Вы разъединяете свой ноутбук и повторно подключаете его где-то в другом месте, это может получить другой IP-адрес. Затем соединение TCP, используемое rsync, было бы разъединено, таким образом, необходимо будет уничтожить его и запуститься снова. Это может также произойти, если Вы приостанавливаете свой ноутбук, и соединение TCP испытывает таймаут. Тайм-аут в конечном счете отфильтрует к прикладному уровню, но он может требовать времени. Безопасно нажать Ctrl+C и выполнить rsync снова.
Вы могли проверить содержание файлов, чтобы удостовериться, что замена произойдет когда 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'
Найдите имеет -exec
оператор, который выполняет произвольную команду. Еще лучше, -exec
тест, таким образом, можно объединить несколько в цепочку -exec
s вместе, и если более ранние команды перестали работать, более поздние не будут выполняться. Строка {}
заменяется текущим именем файла, и ;
отмечает конец команды. Необходимо заключить обоим в кавычки для предотвращения вмешательства оболочки.
Так:
find . -type f \
-exec grep -q 'Ms. Johnson' '{}' \; \
-exec sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g' '{}' \;
{}
к пустой строке при выполнении расширения фигурной скобки.
– 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
закончите имена пустым указателем
Кажется, что необходимо создать список файлов, которые соответствуют критериям поиска сначала.
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
.
как первый аргумент find
. Кроме того, поскольку мне сообщили самому не слишком долго назад, Вы не должны на самом деле заключить в кавычки или выйти {}
– Kevin
21.11.2011, 05:18
find
генерирует разделенный от новой строки список файлов, затем оболочка разбивает этот список в любом пробеле (не только новые строки), и затем оболочка рассматривает каждое слово как шаблон шарика. Это только работает, если Ваши имена файлов не содержат пробел или \[?*
. Другие ответы на этой странице показывают, как сделать это правильно.
– Gilles 'SO- stop being evil'
22.11.2011, 01:15
.
является ненужным с находкой (по крайней мере, находят найденными на Linux), потому что принято, когда никакой путь не передается аргумент. скалы
– laebshade
22.11.2011, 01:48
'{}'
незадолго до Вашего\;
в этом-exec
. – Jander 21.11.2011, 05:13