Извлечение нескольких типов файлов, игнорируя ошибки

Системная информация:

aggitan@moneque:~$ uname -a
Linux moneque 2.6.32-25-generic #44-Ubuntu SMP Fri Sep 17 20:05:27 UTC 2010 x86_64 GNU/Linux

aggitan@moneque:~$ 7z

7-Zip 9.04 beta  Copyright (c) 1999-2009 Igor Pavlov  2009-05-30
p7zip Version 9.04 (locale=en_US.utf8,Utf16=on,HugeFiles=on,2 CPUs)

У меня есть папка с 68 архивами, начиная с.rar, .ace и.zip.

Я хочу извлечь все эти файлы, используя их имя папки в качестве первого каталога ("Извлечь здесь")

Если я использую файл-ролик, он останавливается при первой ошибке, для файла-ролика не появляется флаг "игнорировать ошибку".

Если я использую 7zip, он выдает все в текущую папку и не использует чистые папки

Как я могу извлечь все в отдельные папки, не проливая все в текущий каталог?

3 ответа

Решение

for i in *; do mkdir "$i.extracted"; (cd "$i.extracted" && 7z x "../$i") || echo "Error with $i"; done

Я не знаю ни о каком прямом решении, но с помощью небольшого цикла bash вы можете сделать это в терминале (если, как кажется из вашего вопроса, 7zip может делать все, что вы хотите, кроме извлечения в папку на основе имени файла). Попробуйте (в каталоге с архивами):

for FILE in *.*; do DIR=${FILE%.*}; mkdir $DIR && 7z x -o$DIR $FILE ; done

${FILE%.*} извлекает имя файла без расширения.

Небольшой сценарий оболочки может прийти на помощь.

#! /bin/bash

for archive in "$@"; do (
    archive_dir="$(cd $(dirname "$archive"); pwd -P)"
    archive_name="$(basename "$archive")"
    # make a directory by appending `.d` to the archive file name
    name="${archive_name}.d"
    mkdir -p "$name"
    cd "$name"
    # extract contents with full path, 
    # replace 'x' with 'e' to extract into $name directory
    7z x "${archive_dir}/${archive_name}"
); done

Вставьте вышеперечисленное в файл extract.sh (в каталоге, куда вы хотите извлечь файлы), а затем сделайте его исполняемым:

chmod +x ./extract.sh

Сценарий создает каталог для каждого архива, указанного в командной строке, добавляя .d к его имени файла (например, для архиваstuff.zip это создаст каталог stuff.zip.d), а затем извлекает в него файлы из архива.

Вы можете вызвать его в терминале следующим образом (используйте групповые символы для извлечения нескольких архивов за один раз):

./extract.sh stuff.zip stuff2.rar

Отказ от ответственности: не тестировался, поэтому попробуйте его с одним или двумя примерами архивов, прежде чем делать большой запуск.

Другие вопросы по тегам