Как я могу заменить двоеточия, когда я rsync на USB-ключ?

Вы можете открыть новое частное окно в Firefox (так же, как окно инкогнито Chrome) и использовать его одновременно с обычным браузером с разными учетными записями.

11
задан 9 November 2010 в 19:46

32 ответа

Вместо обычного rsync используйте rdiff-backup . Он автоматически обнаруживает и заменяет символы, которые не поддерживаются на целевом диске, а также откладывает их обратно, как при восстановлении в файловой системе unix. Он создает распакованный каталог, который похож на источник и один дополнительный каталог метаданных.

8
ответ дан 13 August 2018 в 17:11

Самый простой подход - использовать уровень файловой системы для преобразования имен файлов. С Ubuntu 12.04 существует файловая система FUSE , которая преобразует имена файлов в имена, которые поддерживает VFAT Windows: fuse-posixovl

  sudo mount.posixovl / media / sdb1 chown guillaume / media / sdb1 rsync -au ~ / mail / media / sbd1 /  

Или во избежание использования root-доступа:

  mkdir ~ / mnt /sbin/mount.posixovl -S / media / sdb1 ~ / mnt rsync -au ~ / mail ~ / mnt /  

Персонажи в имена файлов, которые VFAT не принимает, кодируются как % (XX) , где XX - шестнадцатеричные цифры. Начиная с POSIXovl 1.2.20120215, будьте осторожны, что имя файла, такое как % (3A) , закодировано как само, и будет декодировано как : , поэтому существует риск столкновения если у вас есть имена файлов, содержащие подстроки формы % (XX) .

Остерегайтесь того, что POSIXovl не справляется с длинными именами файлов. Если кодированное имя не соответствует 255 символам, файл не может быть сохранен.

POSIXovl сохраняет разрешения unix и права собственности в файлах с именем .pxovl.FILENAME .


Следующий файл bash ≥4 script копирует ~ / mail / foo: bar в / media / usb99 / mail / foo_bar , и аналогично для всех файлы в разделе ~ / mail . Файлы, которые уже существуют в дереве назначения и не старше источника, пропущены.

  #! / Bin / bash set -e shopt -s dotglob globstar для источника в "$ HOME"  / почта / ** / *;  do target = / media / usb99 / $ {source # "$ HOME" /} target = $ {target //: / _}, если [[-d $ source]];  затем mkdir -p - "$ target" elif [[$ target -ot $ source]];  то cp -p - "$ source" "$ target" fi done  

Этот скрипт работает под zsh с небольшими изменениями: замените shopt -s dotglob globstar на setopt dot_glob и [[$ target -ot $ source]] by [[! -e $ target || $ target -ot $ source]] .


Вот двухстрочный zsh (три, если вы считаете автозагрузки).

  autoload zargs zmv zargs - ~ / mail / ** / * (/ e \ '' REPLY = / media / usb99 / $ {  $ {REPLY # $ HOME /} //: / _} '\') - mkdir -p - zmv -C -Q -o -pu '~ / mail / (** /) (*) (.)  '' / media / usb99 / mail / $ {1 //: / _} $ {2 //: / _} ' 
  • zargs эквивалентно mkdir -p ~ / mail / ** / * (...) , за исключением того, что он не будет бомбить, если кумулятивная длина имен каталогов слишком велика. Эта строка создает целевые каталоги по мере необходимости.
  • ~ / mail / ** / * (/) расширяется до всех каталогов в ~ / mail (каталоги только из-за (/) в конце).
  • (/ e \ '' ... '\') выбирает только каталоги и далее выполняет код внутри «...», чтобы преобразовать имя каждого файла, которое хранится в переменной REPLY .
  • $ {$ {REPLY # $ HOME /} / /: / _} удаляет префикс, соответствующий исходному каталогу, и изменяет : на _ .
  • zmv -C копирует каждый файл, соответствующий его первому операнду (шаблон zsh), к имени файла, полученному при расширении его второго операнда.
  • -o -pu говорит, чтобы пройти -pu в утилиту cp , чтобы сохранить разрешения и скопировать только обновленные файлы. (Мы могли бы сказать zsh выполнить проверку обновлений, это будет немного быстрее, но еще более загадочным.)
  • (.) выбирает только обычные файлы. -Q говорит, что это нужно анализировать как квалификатор glob, а не как . с круглыми скобками вокруг него, указывающими подвыражение.
  • $ 1 и $ 2 в заменяющем тексте соответствуют заключенным в скобки выражениям (** /) и * . ( ** теряет свое особое значение как ноль или более уровней поддиректории, если оно находится в круглых скобках, если в круглых скобках не указано точно ** / .)

Первоначально я думал использовать pax , который является инструментом архивации (здесь предназначен для использования в сквозном режиме), который имеет функцию переименования файлов (ее -s ). Однако параметры -s и -u не работают вместе (определение pax POSIX буквально говорит о том, что -u должен проверять файл с тем же именем в дереве назначения, а не на имя файла, преобразованное с помощью -s , реализация pax в Ubuntu следует за спецификацией буквально, а не полезно). По-прежнему можно использовать его для переименования жестких ссылок, а затем скопировать жесткие ссылки (с помощью rsync -au или pax -rw -pp -u ) на другие СМИ, но он чувствует больше проблем, чем это стоит.

  cd ~ / mail mkdir -p / media / usb99 / mail pax -rw -l -pp -s '!:! _!  г' .  ../mail.colonless rsync -au ../mail.colonless/ / media / usb99 / mail /  
6
ответ дан 13 August 2018 в 17:11
  • 1
    Я попытаюсь использовать pax. Возможно, вы могли бы улучшить свой ответ, указав необходимый пакет на ubuntu. Это не похоже на обычную установку. – Guillaume Coté 7 November 2010 в 07:19
  • 2
    Просто добавление одного пакета под названием pax заставляет его работать. – Guillaume Coté 7 November 2010 в 07:31
  • 3
    Он ничего не выводит, я пытаюсь добавить параметр -v, чтобы увидеть, что происходит. Кажется, он все время копирует все. Точка rsync должна быть инкрементальной, что заставило меня сэкономить много времени, когда у меня есть только несколько модифицированных файлов в середине большого количества файлов. – Guillaume Coté 7 November 2010 в 07:37
  • 4
    Кажется, он создает каталог «home» в указанном вами пути. Рекомендуется избегать изменения каталога в скрипте, есть ли еще одна возможность избежать создания всех этих каталогов? – Guillaume Coté 7 November 2010 в 08:04
  • 5
    Прошло пять минут на втором проходе, где все было одинаково. rsync занял бы всего несколько секунд. Есть ли опция, которая должна быть указана, чтобы сделать ее инкрементальной? – Guillaume Coté 7 November 2010 в 08:07

Другие вопросы по тегам:

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