Витягніть декілька поштових файлів, кожен у новій теці з тим самим іменем, через термінал Ubuntu


37

У мене є багато поштових файлів a.zip, b.zip, c.zip, ..., і я хочу витягнути кожну з них у нові папки a, b, c, ... відповідно через термінал.

Насправді, те, що я хочу, - це рішення, яке я можу використати пізніше, findоскільки у мене фактично багато папок 2014, 2013, 2012, ... кожна з них містить багато поштових файлів a.zip, b.zip тощо. Якщо я це зробити find . -name "*.zip" -exec {} unzip \;він розпакує всі файли та помістить їх у відповідну батьківську папку.


Відповіді:


72

Ви повинні мати можливість -dопції unzip для встановлення альтернативного каталогу для вмісту архіву.

unzip -d a a.zip
unzip -d b b.zip

і так далі. В рамках findвиразу ви повинні мати можливість отримати ім'я для каталогу з імені zipfile, використовуючи розширення параметра оболонки, наприклад

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

Спершу тестуйте, додавши echoтобто

find -name '*.zip' -exec sh -c 'echo unzip -d "${1%.*}" "$1"' _ {} \;

чи щось подібне

while read -rd $'\0' f; do 
  unzip -d "${f%.*}" "$f"
done < <(find -name '*.zip' -print0)

2
+1 для test it first…частини
mrzmyr

2
findпотрібен каталог, такfind . -name ...
slf

@slf POSIXly, так - але не у випадку GNU find( "Якщо не вказано початкову точку, .передбачається." )
steeldriver

10

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

Метод пошуку - божевільний надскладний без будь-якої причини.

for i in *.zip; do unzip "$i" -d "${i%%.zip}"; done

Це руками вниз - найкраща відповідь на відповідне питання. Попередній смішний, а той після цього не сортує у файли відповідні кореневі папки.
TheMegolith

Як би один йти про створення каталогу без з .zipсуфіксом? Просити друга.
дашард

Відповідь не створює каталог із суфіксом .zip, тобто самою точкою частини в дужках.
kencinder

6

Просто використовуйте

unzip '*.zip' -d /home/user/folder/

11
Якщо я чогось не пропускаю, це розпакує все в / home / user / folder, а не в / home / user / folder / a та / home / user / folder / b
М. Джастін

1

Мені також потрібно було це зробити, використовуючи unrar. Цього можна досягти незначною зміною коду kencinder.

for i in *.rar; do mkdir "${i%%.rar}"; unrar x -r "$i" "${i%%.rar}"; done 

PS: Я хотів додати це як коментар, але мені не вистачає репутаційних балів!

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