Является ли rsync без сохранения состояния?

Заключив в кавычки переменную "$path", вы запускаете цикл один раз, а $iрасширяется до всего списка путей. Таким образом, ваше перенаправление заканчивается чем-то вроде

> filter.result./home/folder/file/source/Tracert_1.txt /home/folder/file/source/Tracert_2.txt...

, что является «неоднозначным». См. этот несколько связанный вопрос Почему зацикливание вывода find является плохой практикой?


На самом деле вам не нужен цикл оболочки -и вам не нужен grep. Вы можете выбрать строки IPv4и перенаправить в файл, имя которого получено из текущего FILENAME, используяawk:

awk '
  /%%TRACERT:/ {sfx = $0; next} 
  /IPv4 type/ {print $1","$2","$3","$4","$5","$6","$7" "$8","sfx > "filter.result." FILENAME}
' tracert_*.txt

Для локальных файлов это приведет к выводу, подобному:

$ head filter.result*
==> filter.result.tracert_1.txt <==
1,3,1,1,1,IPv4,type 10.10.10.10,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
2,3,1,1,1,IPv4,type 10.10.10.10,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
3,0,NULL,NULL,NULL,IPv4,type Timeout,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
4,0,NULL,NULL,NULL,IPv4,type Timeout,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
5,3,1,1,1,IPv4,type 10.10.10.10,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
6,3,1,1,1,IPv4,type 10.10.10.10,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
7,3,1,1,1,IPv4,type 10.10.10.10,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%

==> filter.result.tracert_2.txt <==
1,3,1,1,1,IPv4,type 10.10.10.10,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
2,3,1,1,1,IPv4,type 10.10.10.10,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
3,0,NULL,NULL,NULL,IPv4,type Timeout,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
4,0,NULL,NULL,NULL,IPv4,type Timeout,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
5,3,1,1,1,IPv4,type 10.10.10.10,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
6,3,1,1,1,IPv4,type 10.10.10.10,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%
7,3,1,1,1,IPv4,type 10.10.10.10,%%TRACERT: IPTYPE=IPv4, LOCALIP4="10.10.10.10", PEERIP4="10.10.10.10", MAXHOP=15;%%

Чтобы использовать его с find, вы можете сделать что-то вроде:

find /home/folder/file/source -iname "Tracert*" -execdir awk '
      /%%TRACERT:/ {sfx = $0; outfile = "filter.result." substr(FILENAME,3); next} 
      /IPv4 type/ {print $1","$2","$3","$4","$5","$6","$7" "$8","sfx > outfile}
' {} +

, который поместит выходные файлы в те же каталоги, где находятся входные файлы. Если файлы на самом деле находятся в одном каталоге, было бы проще cdтам, а затем использовать «локальную» команду awk.

1
18.11.2020, 12:41
1 ответ

Rsync не имеет состояния. Каждый раз, когда вы -запускаете его, он повторно -оценивает файлы в источнике и месте назначения, чтобы решить, что передавать.

Однако обратите внимание, что без опции-c(--checksum)rsync не вычисляет контрольные суммы. Он сравнивает только размеры и время модификации. А также владелец, группа и режим, если вы используете -a. Это означает, что при создании списка не нужно открывать и читать какие-либо файлы, только каталоги. Работа с файловой системой, которую должна выполнять ваша команда rsync, примерно такая же, как при запуске find /home/me -ls.

Вы можете использовать опцию --stats, чтобы получить полезную информацию о том, сколько данных передается. Сюда входит поле «Всего отправлено байтов». Вы можете запустить rsync с -n --stats, и в этом поле будет указано, насколько велик список файлов, которые необходимо передать. (Также сообщается «Размер списка файлов», но по какой-то причине я получаю только 0. )Обратите внимание, что rsync не отправляет полный путь для каждого файла, поэтому список файлов может быть значительно меньше 100 байт на файл.

Вас также может заинтересовать Как работает Rsync :Практический обзор .

2
18.03.2021, 22:48

Теги

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