В зависимости от того, как создается zip-файл, иногда он извлекает все файлы напрямую, а иногда он извлекает файлы в подкаталог.
Если последнее верно, как я могу заставить unzip
команду «игнорировать» этот каталог первого уровня?
Пример:
cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll
Что я получаю это /tmp/omeka/omeka-1.5.1/
:
total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/
Мне нужны файлы, извлеченные /tmp/omeka/
(на один уровень выше, и номер версии не включен в структуру каталогов)
/tmp/omeka/(files)
Я знаю, что могу использовать эту -j
опцию для «ненужных путей», но я хочу сохранить структуру подкаталогов, но не структуру каталогов верхнего уровня. Как я могу это сделать?
mv
файлы, но я хотел посмотреть, есть ли способ сделать это прямо из команды unzip/wordpress/
каталог (без номера версии) внутри zip-файла. Это действительно хорошоunzip
и тогда,mv
но отсутствие контроля над этим и необходимость сделать это в два шага всегда немного раздражали меня. К счастью, Wordpress также имеет.tar.gz
вкус :)cd /tmp/omeka && ln -s -T . omeka-1.5.1
Ответы:
Используйте файловую систему FUSE, которая позволяет просматривать архивы, такие как каталоги, такие как AVFS . Используйте
cp
для извлечения файлов в каталог по вашему выбору.Поскольку мы предполагаем, что в архиве имеется один каталог верхнего уровня, вы можете сократить его до
источник
unzip
у меня будет какое-то волшебство, например, указание файлов, которые нужно извлечь*/*
, которые я мог бы использовать, не устанавливая другую утилиту, но, думаю, нет. Благодарю. +1Если ваш zip-файл не содержит структуру каталогов или вам не нужно его сохранять, вы можете использовать это:
источник
Этот скрипт не является надежным, но работает в простых случаях:
Он просто проверяет, существует ли ровно один подкаталог, и если да, удаляет из него все, а затем удаляет его.
источник
Я только что зарегистрировался сегодня, поэтому я не могу поднять ответ @SteveBennet и не могу добавить комментарий там.
Основываясь на его ответе, я создал рекурсивную функцию, подобную этой:
Как сказал @SteveBennet: этот скрипт не является надежным, но работает в простых случаях.
Надеюсь, это полезно.
источник
Нужно выглядит как
patch --strip=n
вариантБыло бы желательно иметь параметр, подобный
patch --strip=number
(или-pnumber
), которыйnumber
вначале прерывает компоненты пути (см. Сравнение и объединение файлов: каталоги исправлений ).Другое решение, применимость
В противном случае, есть другое решение, вроде хакерское, но работает. В моем случае я хотел перезаписать каталог, заполненный существующими файлами, содержимым zip, без предварительного извлечения полного zip.
Когда это решение сработает и будет доступно решение @ Gilles, последнее также сработает. Однако это решение не требует наличия файловой системы FUSE.
Как это сделать
Предполагая, что вы знаете дополнительный каталог, в вашем случае
omeka-1.5.1
вы можете сделать это:unzip
попытается распаковать архив,omeka-1.5.1
который на самом деле является символической ссылкой на содержащий каталог. В результате файлы попадутomeka
напрямую.Возможные варианты
Можно представить варианты перенаправления одной или нескольких частей иерархии зависимостей.
Вывод
Это решение несколько специфично, но у него есть свои варианты использования, и я просто случайно использовал его.
источник
unzip -l
. Это может даже быть автоматизировано с помощью сценария, который вычисляет часть пути, который является общим.zipinfo -1
может быть хорошим началом Какой у вас вариант использования?Скорее всего, вы хотите запустить
unzip
с-j
опцией, как в:Но вы можете быть удивлены его поведением:
Если вы извлечете
files.zip
в выходной каталог,./output
и вы получите это в результате:тогда
-j
опция даст вам это (все пути чередуются):источник