Я думаю, что эти различия довольно хорошо устанавливаются между cp
и rsync
. См. эту статью как ссылку, названную: взгляд rsync производительность. выборка:
The four commands tested were:
rsync $SRC $DEST
echo $SRC | cpio -p $DEST
cp $SRC $DEST
cat $SRC > $DEST/$SRC
The results for rsync, cpio, cp, and cat were:
user sys elapsed hog MiB/s test
5.24 77.92 101.86 81% 100.53 cpio
0.85 53.77 101.12 54% 101.27 cp
1.73 59.47 100.84 60% 101.55 cat
139.69 93.50 280.40 83% 36.52 rsync
Я использую rsync
ежедневно. Существуют вещи, которые можно сделать для улучшения ситуации.
Например, можно попытаться использовать -W
переключатель:
-W, --whole-file copy files whole (w/o delta-xfer algorithm)
Также я предложил бы удостовериться, что Вы имеете 3.x версии rsync
. Были значимые улучшения, когда мы переместились до более новых версий.
Ваша проблема связана с тем, что вы взяли под контроль форматирование вывода, сгенерированного с помощью find
, теперь разбитого на новые строки, \n
. Чтобы получить xargs
для обработки вывода при использовании -0
, вывод необходимо разделить нулевыми символами, \0
. Но вот простой способ это исправить:
$ find . -type f -printf "%C@ %p\n" | sort | tail -n 2 | \
cut -d " " -f 2- | tr '\n' '\0' | xargs -0 mv -t /app/path1/path2/path3
Введение команды `tr '\n' '\0' преобразует новые строки обратно в нули.
Если вы уверены, что имена ваших файлов не будут содержать новых строк или непечатаемых символов, то это один из редких случаев, когда имеет смысл разобрать вывод ls
.
cd /app/path1/path2
latest_file=$(LC_ALL=C ls -cr | head -n 1)
mv "$latest_file" /app/path1/path2/path3
или если вы хотите избежать изменения каталога в основном процессе оболочки:
latest_file=$(LC_ALL=C ls /app/path1/path2 -cr | head -n 1)
mv "/app/path1/path2/$latest_file" /app/path1/path2/path3
Установка LC_ALL=C
для выполнения ls
гарантирует, что не-ASCII-символы печатаются буквально на многих (но не на всех) системах; управляющие символы (которые не печатаются) все еще искажаются на многих системах.
Можно перемещать сразу несколько файлов. Чтобы все еще справляться с большинством имен файлов, выключите глобус и установите IFS
на разделение только на новые строки.
set -f; IFS='
'
mv $(ls -cr /app/path1/path2/* | head -n 2) /app/path1/path2/path3
Если вы можете использовать zsh в качестве оболочки, это намного проще, так как вы можете сортировать и выбирать файлы с помощью глобусного классификатора .
mv /app/path1/path2/*(oc[1,2]) /app/path1/path2/path3
Либо избегайте опции -0 с помощью xargs, либо используйте -print0. Отрывок из man-страницы для xargs
В этих ситуациях это лучше использовать опцию -0, которая предотвращает такие проблемы. При использовании эта опция должна обеспечить , чтобы программа, производящая вход для xargs также использует нулевой символ в качестве разделителя. Если это так Программа является GNU найти, например, -print0 делает это за вас.