Нет, rsync не обнаруживает, что файл был перемещен, только то, что файл был удален, а другой был создан.
Как уже сказал @wurtel, опция --fuzzy
может помочь оптимизировать копирование данных (не только для перемещенных файлов, но также и тогда, когда вокруг )есть файлы с похожим содержимым.
Если вы хотите, чтобы старый экземпляр файла был удален, вам потребуется один из вариантов --delete
.
Надеюсь, кто-нибудь поможет вам с ответом, который использует инструмент, поддерживающий XML -, но если нет, и если предположить, что ваш ввод действительно похож на образец, который вы предоставили -с использованием GNU awk дляsorted_in
:
$ cat tst.awk
BEGIN { RS=""; ORS="\n\n"; FS="</?date>" }
{
split($2,d,/[, ]+/)
mthAbbr = substr(d[1],1,3)
mthNr = ( index( "JanFebMarAprMayJunJulAugSepOcNovDec", mthAbbr ) + 2 ) / 3
date = sprintf("%04d%02d%02d",d[3], mthNr, d[2])
items[date] = $0
}
END {
PROCINFO["sorted_in"] = "@ind_num_desc"
for ( date in items ) {
print items[date]
}
}
$ awk -f tst.awk file
<item>
<date>August 24, 2021</date>
<p>Text</p>
</item>
<item>
<date>July 20, 2021</date>
<p>some text</p>
</item>
<item>
<date>February 11, 2020</date>
<p>more text</p>
</item>
или используя любой awk плюс сортировку и вырезание:
$ cat tst.awk
BEGIN { RS=""; FS="\n"; OFS="\t" }
{
split($2,d,/[<>, ]+/)
mthAbbr = substr(d[3],1,3)
mthNr = ( index( "JanFebMarAprMayJunJulAugSepOcNovDec", mthAbbr ) + 2 ) / 3
date = sprintf("%04d%02d%02d",d[5], mthNr, d[4])
for (i=1; i<=NF; i++) {
print date, NR, i, $i
}
print date, NR, i, ""
}
$ awk -f tst.awk file | sort -k1,1rn -k2,3n | cut -f4-
<item>
<date>August 24, 2021</date>
<p>Text</p>
</item>
<item>
<date>July 20, 2021</date>
<p>some text</p>
</item>
<item>
<date>February 11, 2020</date>
<p>more text</p>
</item>
Второй вариант будет лучшим выбором, если ваш входной файл огромен, так как он не требует, чтобы awk хранил весь входной файл в памяти перед его печатью. Он работает, украшая входные строки, чтобы добавить дату для каждой item
, за которой следует номер текущей записи (item
), за которым следует номер текущей строки в этом item
, чтобы sort
затем можно было отсортировать по date
, но сохранить исходный порядок ввода даже для повторяющихся дат,а затем cut
просто удаляет декорации, добавленные первым awk
для облегчения сортировки. Вот как выглядят результаты первых двух шагов, чтобы вы могли увидеть, что они делают:
$ awk -f tst.awk file
20210824 1 1 <item>
20210824 1 2 <date>August 24, 2021</date>
20210824 1 3 <p>Text</p>
20210824 1 4 </item>
20210824 1 5
20200211 2 1 <item>
20200211 2 2 <date>February 11, 2020</date>
20200211 2 3 <p>more text</p>
20200211 2 4 </item>
20200211 2 5
20210720 3 1 <item>
20210720 3 2 <date>July 20, 2021</date>
20210720 3 3 <p>some text</p>
20210720 3 4 </item>
20210720 3 5
$ awk -f tst.awk file | sort -k1,1rn -k2,3n
20210824 1 1 <item>
20210824 1 2 <date>August 24, 2021</date>
20210824 1 3 <p>Text</p>
20210824 1 4 </item>
20210824 1 5
20210720 3 1 <item>
20210720 3 2 <date>July 20, 2021</date>
20210720 3 3 <p>some text</p>
20210720 3 4 </item>
20210720 3 5
20200211 2 1 <item>
20200211 2 2 <date>February 11, 2020</date>
20200211 2 3 <p>more text</p>
20200211 2 4 </item>
20200211 2 5
Предполагая, что <item>
являются частью некоторого контейнера<foo>
$ cat file.xml
<foo>
<item>
<date>August 24, 2021</date>
<p>Text</p>
</item>
<item>
<date>February 11, 2020</date>
<p>more text</p>
</item>
<item>
<date>July 20, 2021</date>
<p>some text</p>
</item>
</foo>
затем использование xq
из проекта yq для усиления jq
возможностей анализа и сортировки времени:
$ xq -x '.foo.item |= sort_by(now - (.date | strptime("%B %d, %Y") | mktime))' file.xml
<foo>
<item>
<date>August 24, 2021</date>
<p>Text</p>
</item>
<item>
<date>July 20, 2021</date>
<p>some text</p>
</item>
<item>
<date>February 11, 2020</date>
<p>more text</p>
</item>
</foo>