Перемещение последних файлов от одного каталога до другого

Я думаю, что эти различия довольно хорошо устанавливаются между 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. Были значимые улучшения, когда мы переместились до более новых версий.

4
12.07.2014, 22:24
3 ответа

Ваша проблема связана с тем, что вы взяли под контроль форматирование вывода, сгенерированного с помощью 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' преобразует новые строки обратно в нули.

1
27.01.2020, 21:00

Если вы уверены, что имена ваших файлов не будут содержать новых строк или непечатаемых символов, то это один из редких случаев, когда имеет смысл разобрать вывод 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
27.01.2020, 21:00

Либо избегайте опции -0 с помощью xargs, либо используйте -print0. Отрывок из man-страницы для xargs

В этих ситуациях это лучше использовать опцию -0, которая предотвращает такие проблемы. При использовании эта опция должна обеспечить , чтобы программа, производящая вход для xargs также использует нулевой символ в качестве разделителя. Если это так Программа является GNU найти, например, -print0 делает это за вас.

1
27.01.2020, 21:00

Теги

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