Разархівуйте багато файлів у заданий каталог


1

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

приклад:

Файли: a.zip,b.zip

Командування

for i in `ls *.zip`; do unzip $i -d  `echo $i | cut -f1 -d'.'` ; done

очікується:

Папка aіз вмістом a.zip папки bіз вмістомb.zip

Що відбувається:

Не знайдено поштових файлів. unzip: не вдається знайти або відкрити a.zip, a.zip.zip або a.zip.ZIP.

Будь-яка порада щодо того, що може бути неправильним?


1
Ви перевіряли дозволи на читання цих zip-файлів?

дивіться цю відповідь

Відповіді:


1

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

 find . -name "*.zip" -exec bash -c ' unzip "$0" -d "${0%*.zip}"  '  {} \;

Як запропоновано у зниклій відповіді, без необхідності створення каталогу для кожного файлу це потрібно робити unzip '*zip'. Зверніть увагу на цитату '. Якщо zip-файли були створені чимось схожим на zip -r myfolder.zip myfolder/просту команду unzip, відтворять структуру каталогу. BTW У цьому випадку це чудово спрацьовує навіть з подвійною цитатою unzip "*zip"або уникненням *з unzip \*zip.
Гастур

1

Це має працювати:

for i in *.zip; do
newdir="${i:0:-4}" && mkdir "$newdir"
unzip "$i" -d  "$newdir"
done

... і це буде, поки всі назви ваших файлів не будуть без спеціальних символів або пробілів, інакше вони генеруватимуть помилку та вийдуть з кодом помилки ( echo $?) 1. Загалом не пропонується проаналізувати вихід ls
Hastur

Так, lsтут не рекомендується, я використовував це, оскільки я щойно редагував оригінальну публікацію ОП. опущено lsзараз
Джахід

З цитатами (як "$i") він повинен містити пробіл та нові рядки. Не забудьте додати цитату "для вирішення цих проблем. (Перевірте це, наприклад, cp c.zip a$'\n'b.zipце створить файл з новим рядком між aі, b.zipякщо файл c.zipіснує).
Гастур

-1

Використовуй це:

for i in `find | grep .zip$`;do unzip $i;done

EDIT

Попередня відповідь неправильна (;

for i in `find | grep .zip$ | sed 's@.zip$@@'`;do mkdir $i;unzip $i.zip -d $i;done

Спробуйте це!


Це не буде витягувати вміст у вказаному каталозі :)
thclpr

Так, пропустив цю частину (; зараз я виправляю свою відповідь

Гаразд, я тим часом готую вашу думку про прийняття.
thclpr

Це тупо, надано, але все-таки має працювати, якщо надійде більш елегантна відповідь,

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