4

Я работаю над переносом содержимого веб-сайта, который был предоставлен мне в архиве RAR, на новый сервер.

Я не совсем уверен, какой это вкус Linux; uname -a говорит мне:

Linux bolt.sonic.net 2.4.37.5 #1 SMP Mon Aug 17 10:15:36 PDT 2009 i686 unknown

и unrar --help говорит мне:

UNRAR 3.00 freeware      Copyright (c) 1993-2002 Eugene Roshal

Я не являюсь обычным пользователем unrar, но в моем ограниченном предыдущем опыте, насколько я помню, простая команда unrar x archive.rar всегда делала правильные вещи.

Но когда я пытаюсь распаковать текущий архив, в результате получается каталог с плоской структурой, содержащий 4500 нечетных файлов и каталогов, имена которых имеют обратную косую черту в том месте, где должны находиться разделители каталогов, например:

drwxr-xr-x    2 yoyodyne user         4096 Jan 18 14:53 yoyodyne
drwxr-xr-x    2 yoyodyne user         4096 Jan 18 14:53 yoyodyne\application
drwxr-xr-x    2 yoyodyne user         4096 Jan 18 14:53 yoyodyne\application\config
-rw-r--r--    1 yoyodyne user         2765 Sep 15  2011 yoyodyne\application\config\database.php
-rw-r--r--    1 yoyodyne user         1152 Sep 15  2011 yoyodyne\application\config\doctypes.php
-rw-r--r--    1 yoyodyne user         1844 Sep 15  2011 yoyodyne\application\config\foreign_chars.php
-rw-r--r--    1 yoyodyne user          513 Sep 15  2011 yoyodyne\application\config\hooks.php
-rw-r--r--    1 yoyodyne user          123 Sep 15  2011 yoyodyne\application\config\index.html
...

Я в полном недоумении, чтобы понять, что вызывает это, или как обойти это. Я не вижу каких-либо очевидных опций в команде unrar которые говорят, например, «Эй, я в системе Linux» или «Эй, не обращайте внимания на тот факт, что этот архив был создан в системе Windows».

(На самом деле, я не знаю, был ли архив создан в системе Windows или нет. Разработчик, приславший мне архив, ничего не сказал и сразу же после этого ушел в отпуск - это означает, что мои шансы получить ответ или заменить архив в другом формате невелики.)

Что бы это ни стоило, программа unrar кажется, понимает, что часть имени после последней обратной косой черты является фактическим именем файла. Часть вывода unrar l archive.rar соответствующая приведенному выше частичному каталогу:

 Name             Size   Packed Ratio  Date   Time     Attr      CRC   Meth Ver
-------------------------------------------------------------------------------
 database.php     2765     1071  38% 15-09-11 10:57   .....A   13CDB2C8 m3g 2.9
 doctypes.php     1152      381  33% 15-09-11 10:57   .....A   F25E706F m3g 2.9
 foreign_chars.php     1844      856  46% 15-09-11 10:57   .....A   12AF75FD m3g 2.9
 hooks.php         513      285  55% 15-09-11 10:57   .....A   4029E30E m3g 2.9
 index.html        123      107  86% 15-09-11 10:57   .....A   E8DFAEB4 m3g 2.9
 ...
 config              0        0   0% 18-01-13 14:53   .D....   00000000 m0  2.0
 ...
 application         0        0   0% 18-01-13 14:53   .D....   00000000 m0  2.0
 ...

Итак, учитывая это, и учитывая, что программа unrar работает в системе Linux, почему она создает эти сумасшедшие имена файлов? И что я могу с этим поделать?

1 ответ1

0

Я не знаю , решение для unrar себя, но если вы можете запустить vidir и , если вам удастся распаковать содержимое архива в виде плоского структурированный каталог, то это то , что вы можете попытаться преобразовать его в дереве каталогов:

# cd to the directory
find . | sort | vidir -

Это откроет ваш текстовый редактор. Используйте его возможности, чтобы заменить каждый \ на / и сохранить файл без изменения его пути (это временный файл). vidir переместит файлы и каталоги на их новые пути, создав желаемое дерево каталогов.

Заметки:

  • Необычные символы в именах файлов не поддерживаются, vidir ожидает текстовый ввод со стандартными символами новой строки в качестве разделителей записей (он не будет работать с find . -print0 или sort -z).
  • Я использовал sort чтобы каждая строка, представляющая каталог, предшествовала его содержимому. Это важно, потому что vidir создаст недостающие каталоги при перемещении объекта по его новому пути. Дальнейшее перемещение исходного каталога приведет к конфликту имен, разрешаемому с помощью суффикса ~ , вам этого не нужно. Вы хотите переместить каталог до его содержимого, отсюда и sort .
  • Установите $EDITOR чтобы vidir использовал выбранный вами текстовый редактор (например, EDITOR=vi vidir).
  • Вы можете попробовать экспериментальный подход из моего другого ответа, чтобы заменить символы автоматически, не играя в текстовом редакторе вручную. В вашем случае команда будет:

    find . | sort | EDITOR='sed -i s|\\|/|g' vidir -
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .