1

У меня есть много файлов в каталоге. у каждого из них очень разные имена:

one.tar.gz
juk.tar.gz
cv.tar.gz
erf.tar.gz
vcx.tar.gz
cxcd.tar.gz
vc.tar.gz
jkjk.tar.gz
zxc.tar.gz
asd.tar.gz
ghj.tar.gz
kll.tar.gz
qwe.tar.gz

Извлечение по одному занимает очень много времени. Поэтому я хочу извлечь все эти файлы с помощью одной команды. Я пробовал tar -xzf * но не работает

7 ответов7

8

Используя find mojo:

find . -maxdepth 1 -type f -iname '*.tar.gz' -exec tar xzf '{}' \;
7

Ожидается, что он не будет работать, так как tar -xzf *.tar.gz в вашем случае расширится до tar -xzf one.tar.gz juk.tar.gz cv.tar.gz ... Это означает , Gunzip one.tar.gz и извлечь из него файлы с именем juk.tar.gz cv.tar.gz и т.д. Это явно не то , что вы хотите.

Вы должны сделать цикл для всех файлов tar.gz, чтобы извлечь их.

Например:

for f in *.tar.gz ; do tar -xzf $f ; done
1

goreSplatter - это то, что я хотел бы сделать, но в то же время вот правильная форма цикла for:

for tarball in *.tar.gz ; do
    tar xzf "$tarball"
done
  • Важно указать расширение переменной в случае, если в некоторых файлах есть пробелы или другие специальные символы в именах.
  • Связанные аргументы не требуют и не должны использовать символ переноса (-) для переносимости.
  • Современные tars даже позволят вам опустить z так как он автоматически определяет тип сжатия.
1

Другие решения могут быть:

cat *.tar.gz | tar xvf - -ignore-blocks

Но это ошибка парсера tar (согласно 1), так что лучше использовать:

cat *.tar.gz | tar xvf - --ignore-zeros --listed-incremental=noreblocks

Или напрямую (тот, который я использую):

cat *.tar.gz | tar tvf - --ignore-zeros

Пример: [ac] .tar файлы одинаковые.

me@herpes:/tmp/test$ ls -1
aa.tar
a.tar
bb.tar
b.tar
cc.tar
c.tar
me@herpes:/tmp/test$ cat * | tar tf - --ignore-zeros
a1
a2
stopbroker
startbroker
b1
b2
stopbroker
startbroker
c1
c2
stopbroker
startbroker
me@herpes:/tmp/test$ for i in *; do tar tf $i;done
a1
a2
stopbroker
startbroker
b1
b2
stopbroker
startbroker
c1
c2
stopbroker
startbroker
1
for i in *.tar.gz
do tar -xzf $i
done

Будет работать нормально

1

Один из способов - использовать цикл for .

for i *.tar.gz; do tar -xvz $i; done
1
ls *.tar.gz | xargs -n 1 tar -xzf

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .