Зіставте архів, не включаючи батьківський каталог


30

Я хочу застібкувати багато папок у дерево каталогів так

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

Коли я намагаюся його зашпаркувати, це закінчується створенням zip-архіву з папкою v замість вмісту в ній (підкаталоги та файли)

Як я можу цього уникнути?

Відповіді:


23

Тож якщо я правильно розумію, ви намагаєтесь архівувати файли та папки в певній папці, але не включаючи кореневу папку.

Приклад:

/test/test.txt
/test/test2.txt

де test.txt і test2.txt зберігатимуться в zip, але не / test /

Ви можете ввійти в каталог / test /, а потім запустити щось на зразок,

zip -r filename.zip ./*

Який створив би архів у тій же папці з ім'ям filename.zip. Або якщо ви запускаєте його поза папкою, яку ви можете запустити,

zip -r test.zip test/*

/ * - це частина, що включає лише вміст папки, а не всю папку.

Редагувати: ОП хотів декількох блискавок, рішення в кінцевому підсумку було трохи злому, мені цікаво, чи є кращий спосіб зробити це.

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;

так, але у мене є багато файлів, на яких я роблю те саме, щоб це було нудно робити так, як є такий, як баш сценарій чи щось таке, що автоматизувало б той самий процес у каталозі, у якому є всі папки
Dami

1
Гаразд, я запустив сценарій, і він створив батьківський каталог в архіві, я хочу, щоб в архіві був лише вміст папки
Dami

1
моя помилка, трохи пропустив її. додав параметр -j, який я щойно подивився, мабуть, пропускає ту частину, яку ви не хочете. спробуйте це:for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
zzbomb

18
zip -r test.zip test / * ззовні додає тест як каталог у zip-файл
smihael

4
як заявив @smihael, zip -r test.zip test/*не працює. чи є правильний спосіб досягти цього за межами каталогу?
andrhamm

22

Використовуйте -jабо --junk-pathsпараметр у вашій команді zip.

Зі сторінки сторінки zip :

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).

Це здається правильною відповіддю.
mutant_city

3
А як щодо вкладених шляхів / папок?
GuyPaddock

3
Це втратить усі папки в архіві, і якщо у вас є дублікати імен файлів у різних папках, це підірветься. Це має своє місце, але лише якщо ви не дбаєте про папки та просто хочете файли. Не те, про що просила ОП, але все-таки хороші знання
Говінд Рай

17

Як щодо цієї команди?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..

5
Хоча це правильна відповідь, вступ не звучить так, як ви самі переконалися. Це також допоможе трохи пояснити, що робить команда.
Нефенте

1
Це було і моє рішення, але мені це не подобається, оскільки воно передбачає cd. Сподівався, що існує спосіб точніше вказати збережений шлях.
nilskp

3

Сподіваюся, це допомагає.

(cd directory && zip -r ../out.zip .)

Він зберігає основну оболонку в тому самому каталозі і лише змінюючи каталог підрозділу, який гине після команди.


Я хотів додати це як коментар до відповіді @Alfred UC , але у мене недостатньо репутації для цього.
Кеннет

Якщо вона насправді вирішує проблему, то це може бути рішенням.
Yufenyuy Veyeh Dider

Це краще як відповідь. Це працює і в bash і sh?
Арлен Бейлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.