3

У меня есть файл All CRGs.zip и я хочу разархивировать его содержимое в каталог с именем data (который уже существует и в нем есть другие файлы).

Это возможно? Я работаю над OSX.

Я пробовал:

$ unzip "All CRGs.zip" -d data/

Но это распаковывает все в data/All CRGs что не то, что я ищу. Я бы хотел, чтобы все было прямо в data .

Это возможно?

2 ответа2

3

Вы можете либо воссоздать полную структуру папок, включая папку « All CRGs либо опустить все папки внутри ZIP-файла, используя -j -flag для команды unzip.

Проблема в том, что ZIP-файл был создан с использованием All CRGs CRGs в качестве верхнего уровня, например zip "All CRGs.zip" "All CRGs" . Правильный путь был бы zip "All CRGs.zip" "All CRGs/*" который бы создал ZIP-архив всех файлов и папок внутри папки All CRGs CRGs без окружающей папки.

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

unzip "All CRGs.zip" -d data/ && mv "data/All CRGs/*" "data/" && rmdir "data/All CRGs"

Он разархивирует всю папку и после этого переместит содержимое папки на один уровень вверх и, наконец, удалит (теперь пустую) папку "Все CRG".

1

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

ln -s . 'data/All CRGs'
unzip 'All CRGs.zip' -d data

Шаг ln вызывает создание папки data/All CRGs на текущий каталог (относительно data/), который является data/ . Затем, когда вы извлекаете файлы из All CRGs.zip и команда unzip пытается создать data/All CRGs/file.dat , этот файл будет создан как data/./file.dat .

Эту технику можно продемонстрировать без zip-файла, используя touch:

$ mkdir data
$ ln -s . data/subdir     
$ touch data/subdir/foo.txt
$ ls data
foo.txt subdir

Вы также можете использовать этот трюк для извлечения определенных файлов или папок в альтернативную папку:

ln -s /tmp data/subdir2

Тогда все, что находится в архиве, извлекаемом в subdir2 , появится в /tmp .

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