Как я могу просмотреть содержимое файла tar.gz без извлечения из командной строки?

Я хочу просмотреть содержимое (список файлов и папок) архива, например, файл tar.gz, , не распаковывая его.

Есть ли способы сделать это?

331
задан 30 March 2015 в 20:13

11 ответов

Выполните следующую команду в терминале, чтобы увидеть содержимое файла tar.gz, не извлекая его:

tar -tf filename.tar.gz

screenshot of listing compressed tarball files in the terminal

-t, --list
. Перечислить содержимое архива. Аргументы являются необязательными. Когда они заданы, они указывают имена членов списка.

-f, --file=ARCHIVE Используйте архивный файл или устройство ARCHIVE...

334
ответ дан 30 March 2015 в 20:13

Также можно использовать vim

vim filename.tar.gz
136
ответ дан 30 March 2015 в 20:13

less также может открыть gz-сжатые и несжатые архивы tar. Это дает вам прекрасный вывод в стиле ls -l:

$ less ~/src/compiz_0.9.7.8-0ubuntu1.6.debian.tar.gz
drwxrwxr-x 0/0               0 2012-09-21 11:41 debian/
drwxrwxr-x 0/0               0 2012-08-09 13:32 debian/source/
-rw-rw-r-- 0/0              12 2012-08-09 13:32 debian/source/format
-rw-rw-r-- 0/0              25 2012-08-09 13:32 debian/libdecoration0-dev.docs
-rw-rw-r-- 0/0              25 2012-08-09 13:32 debian/compiz-dev.docs
-rw-rw-r-- 0/0             347 2012-08-09 13:32 debian/compiz-core.install
-rw-rw-r-- 0/0             125 2012-08-09 13:32 debian/libdecoration0-dev.install
...

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

43
ответ дан 30 March 2015 в 20:13

Вы можете использовать команду z: zcat , zless , zgrep .

Для просмотра содержимого файлов используйте:

zcat file.gz   

Чтобы grep something использовать:

zgrep test file.gz   

Чтобы проверить разницу между файлами, используйте:

zdiff file1.gz file2.gz

Это всего лишь несколько примеров, их гораздо больше.

40
ответ дан 30 March 2015 в 20:13

tar флаг -t будет отображать содержимое для вас. Добавьте это к другим своим флагам (так -tvfz для tar.gz , -tvfj для tar.bz2 и т. Д.) и вы можете просматривать без извлечения. Оттуда вы можете довольно легко извлекать отдельные файлы

tar -xvfz mybackup.tar.gz path/to/file

. Большая проблема с tar - это запоминание всех других флагов . Поэтому я обычно полагаюсь на 7z (из пакета p7zip-full ) для выполнения всего моего архивирования. Я не буду утверждать, что он совсем лучше, но он поддерживает почти все (без необходимости указывать тип сжатия), и аргументы логичны.

7z l archive.ext
7z e archive.ext path/to/file

Это, конечно, менее способно, но вам не нужен человек страницу, чтобы использовать его.

Также есть Midnight Commander ( mc ). Это универсальный задира для квазиграфического управления файлами через терминал, и после небольшого тестирования он просто позволяет вам просматривать оба архива .tar.gz и .7z . Я не уверен, сколько еще он поддерживает.

9
ответ дан 30 March 2015 в 20:13
  • 1
    @MadhavNikam ах, таким образом, $ (который диски гнома) работа привычки, если you' ve изменил полномочия. You' d должны дать полный путь. I' ll редактируют мой ответ за секунду – Sergiy Kolodyazhnyy 11 June 2015 в 23:37

Ну, это зависит от файла. Большинство программ (де) сжатия имеют флаг, отображающий содержимое архива.

  1. tar / tar.gz / tgz / tar.xz / tar.bz2 / tbz файлы

     $ tar tf foo.tgz
    dir1 /
    dir1 / subdir1 /
    dir1 / subdir1 / файл
    dir1 / subdir2 /
    каталог1 / подкаталог2 / файл
    dir2 /
     
  2. zip файлы

     $ zip -sf foo.zip
    Архив содержит:
      dir1 /
      dir2 /
      dir1 / subdir1 /
      dir1 / subdir1 / файл
      dir1 / subdir2 /
      каталог1 / подкаталог2 / файл
    Всего 6 записей (0 байт)
     
  3. 7zip файлы

     $ 7z l foo.7z
    
    7-Zip [64] 9.20 Copyright (c) 1999-2010 Игорь Павлов 18-11-2010
    p7zip версии 9.20 (locale = en_US.utf8, Utf16 = on, HugeFiles = on, 4 процессора)
    
    Архив листинга: foo.7z
    
     -
    Путь = foo.7z
    Тип = 7z
    Сплошной = -
    Блоки = 0
    Физический размер = 168
    Размер заголовков = 168
    
      Дата Время Размер атрибута Сжатое имя
     ------------------- ----- ------------ ------------ -  ----------------------
    2015-03-30 19:00:07 .... A 0 0 dir1 / subdir1 / file
    2015-03-30 19:00:07 .... A 0 0 dir1 / subdir2 / file
    2015-03-30 19:07:32 D .... 0 0 dir2
    2015-03-30 19:00:07 D .... 0 0 dir1 / subdir2
    2015-03-30 19:00:07 D .... 0 0 dir1 / subdir1
    2015-03-30 19:00:06 D .... 0 0 dir1
     ------------------- ----- ------------ ------------ -  ----------------------
      0 0 2 файла, 4 папки
     
  4. rar файлы

      $ rar v foo.rar
    
    RAR 4.20 Copyright (c) 1993-2012 Александр Рошаль 9 июня 2012 г.
    Пробная версия Тип RAR -?  за помощью
    
    Архив foo.rar
    
    Путь / Комментарий
      Размер Соотношение упаковки Дата Время Атрибут CRC Мет Вер
     --------------------------------------------------  -----------------------------
      dir1 / subdir1 / файл
      0 8 0% 30-03-15 19:00 -rw-r - r-- 00000000 м3б 2,9
      каталог1 / подкаталог2 / файл
      0 8 0% 30-03-15 19:00 -rw-r - r--00000000 м3б 2,9
      dir1 / subdir1
      0 0 0% 30-03-15 19:00 drwxr-xr-x 00000000 m0 2.0
      dir1 / subdir2
      0 0 0% 30-03-15 19:00 drwxr-xr-x 00000000 m0 2.0
      dir1
      0 0 0% 30-03-15 19:00 drwxr-xr-x 00000000 m0 2.0
      dir2
      0 0 0% 30-03-15 19:07 drwxr-xr-x 00000000 m0 2.0
     --------------------------------------------------  -----------------------------
      6 0 16 0%
     

Это наиболее популярные форматы архивов. Имея все это в виду, вы могли бы написать небольшой сценарий, который использует соответствующую команду в зависимости от расширения файла, который вы ему даете:

#!/usr/bin/env bash

for file in "$@"
do
    printf "\n-----\nArchive '%s'\n-----\n" "$file"
    ## Get the file's extension
    ext=${file##*.}
    ## Special case for compressed tar files. They sometimes
    ## have extensions like tar.bz2 or tar.gz etc.
    [[ "$(basename "$file" ."$ext")" =~ \.tar$ ]] && ext="tgz"

    case $ext in
        7z)
            type 7z >/dev/null 2>&1 && 7z l "$file" || 
            echo "ERROR: no 7z program installed"
            ;;
        tar|tbz|tgz)
            type tar >/dev/null 2>&1 && tar tf "$file"|| 
            echo "ERROR: no tar program installed"
            ;;
        rar)
            type rar >/dev/null 2>&1 && rar v "$file"|| 
            echo "ERROR: no rar program installed"
            ;;
        zip)
            type zip >/dev/null 2>&1 && zip -sf "$file"|| 
            echo "ERROR: no zip program installed"
            ;;
        *)
            echo "Unknown extension: '$ext', skipping..."
            ;;
    esac
done

Сохраните этот сценарий в своем PATH и сделайте его исполняемым. Затем вы можете перечислить содержимое любого архива:

$ list_archive.sh foo.rar foo.tar.bz foo.tar.gz foo.tbz foo.zip

-----
Archive 'foo.rar'
-----

RAR 4.20   Copyright (c) 1993-2012 Alexander Roshal   9 Jun 2012
Trial version             Type RAR -? for help

Archive foo.rar

Pathname/Comment
                  Size   Packed Ratio  Date   Time     Attr      CRC   Meth Ver
-------------------------------------------------------------------------------
 dir1/subdir1/file
                     0        8   0% 30-03-15 19:00 -rw-r--r-- 00000000 m3b 2.9
 dir1/file
                     0        8   0% 30-03-15 19:29 -rw-r--r-- 00000000 m3b 2.9
 dir1/subdir1
                     0        0   0% 30-03-15 19:00 drwxr-xr-x 00000000 m0  2.0
 dir1
                     0        0   0% 30-03-15 19:29 drwxr-xr-x 00000000 m0  2.0
 dir2
                     0        0   0% 30-03-15 19:07 drwxr-xr-x 00000000 m0  2.0
-------------------------------------------------------------------------------
    5                0       16   0%


-----
Archive 'foo.tar.bz'
-----
dir1/
dir1/subdir1/
dir1/subdir1/file
dir1/file
dir2/

-----
Archive 'foo.tar.gz'
-----
dir1/
dir1/subdir1/
dir1/subdir1/file
dir1/file
dir2/

-----
Archive 'foo.tbz'
-----
dir1/
dir1/subdir1/
dir1/subdir1/file
dir1/file
dir2/

-----
Archive 'foo.zip'
-----
Archive contains:
  dir1/
  dir1/subdir1/
  dir1/subdir1/file
  dir1/file
  dir2/
Total 5 entries (0 bytes)

И поскольку кто-то упомянул, что этот меньший редактор, естественно, emacs также могут это сделать:

emacs showing an archive's contents

11
ответ дан 30 March 2015 в 20:13

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

vim archive.tar.gz

enter image description here

Нажмите клавиши со стрелками для прокрутки и Enter , чтобы открыть файл.

7
ответ дан 30 March 2015 в 20:13
  • 1
    @MAdhavNikam да, эта операция ничего не показывает в консоли. Если Вы сделали первую команду sudo chmod 700 $(which gnome-disks) && sudo mv /usr/share/applications/gnome-disks.desktop /usr/share/applications/gnome-disks.desktop.bak, Это скрывает дисковую утилиту от других, кроме пользователя root. После выполнения 'sudo sh-c ' chmod 755/usr/bin/gnome-disks & & mv/usr/share/applications/gnome-disks.desktop.bak/usr/share/applications/gnome-disks.desktop' это должно быть тихо, но диски гнома должны теперь быть доступными снова. – Sergiy Kolodyazhnyy 11 June 2015 в 23:56

Midnight Commander ( mc ) также имеет хороший просмотрщик сжатых файлов, хотя я считаю это немного обманом, поскольку mc является файловым менеджером, хотя и основанный на тексте.

Кроме того, если все, что вам нужно, это посмотреть, что находится внутри сжатых архивов, вы можете изучить команду "view" для каждого компрессора. tar tzvf покажет вам содержимое tar-файла, unzip -l сделает это для zip-файла и т. Д.

5
ответ дан 30 March 2015 в 20:13

Использование просмотреть filename.tar.gz тоже будет работать. почти так же, как и vim, но без разрешений на запись.

3
ответ дан 30 March 2015 в 20:13
  • 1
    пользователь sudo всегда будет в состоянии запустить его. Но вопрос состоял в том, как скрыть его от людей, которые, вероятно, не знают, как использовать командную строку. – Pilot6 11 June 2015 в 22:54

lesspipe - это сценарий оболочки, установленный по умолчанию как часть пакета less , который может отображать содержимое архива tar.gz , а также ряд другие распространенные форматы архивных файлов.

$ lesspipe example.tar.gz
drwxrwxr-x ubuntu/ubuntu     0 2018-11-16 05:32 example/
-rw-rw-r-- ubuntu/ubuntu     7 2018-11-16 05:32 example/ask.txt
-rw-rw-r-- ubuntu/ubuntu     7 2018-11-16 05:32 example/ubuntu.txt

Он вызывается командой less ( см. ответ Оли ) в качестве входного препроцессора, если переменная среды $ LESSOPEN равна

Если вы любите приключения, загляните в vi / usr / bin / lesspipe , чтобы увидеть, какие команды он использует. Для файлов, соответствующих расширению tar.gz , мы видим, что он использует под капотом tar tzvf вместе с параметром - force-local для отключения непонятная особенность tar , которая в противном случае могла бы спутать двоеточия в имени файла с командой использования удаленного ленточного накопителя:

*.tar.gz|*.tgz|*.tar.z|*.tar.dz)
        tar tzvf "$1" --force-local

Обратите внимание, что, поскольку он изначально разработан как препроцессор для less , он ничего не выведет, если не распознает тип файла. Я заметил, что некоторые файлы .tar.gz , которые я скачал, не работали, потому что они фактически не использовали сжатие gzip, несмотря на имя файла.

3
ответ дан 30 March 2015 в 20:13
  • 1
    @Pilot6, которые я предлагаю вместо комнаты, делают mv, гнома-disks.desktop гному-disks.desktop.bak – Sergiy Kolodyazhnyy 11 June 2015 в 23:06

Если вы хотите просмотреть содержимое определенного файла в архиве без извлечения архивирование или запись на диск любым способом, используйте флаг -O (заглавная o) для записи в стандартный вывод вместо файла.

tar -Oxvf gerald.tar.gz /path/to/sandra.txt | less

Убедитесь, что O стоит перед f, иначе программа попытается проанализировать O как имя файла .

1
ответ дан 8 October 2019 в 20:58

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

Похожие вопросы: