Перечисление содержимого файла tar или каталога только до некоторого уровня - PullRequest
47 голосов
/ 23 апреля 2010

Интересно, как перечислить содержимое файла tar только до некоторого уровня?

Я понимаю, tar tvf mytar.tar перечислит все файлы, но иногда я хотел бы видеть каталоги только до некоторого уровня.

Аналогично, для команды ls, как мне управлять уровнем подкаталогов, которые будут отображаться? По умолчанию он показывает только прямые подкаталоги, но не идет дальше.

Ответы [ 5 ]

124 голосов
/ 14 ноября 2011

глубина = 1

tar --exclude="*/*" -tf file.tar


Глубина = 2

tar --exclude="*/*/*" -tf file.tar
28 голосов
/ 23 апреля 2010
tar tvf scripts.tar | awk -F/ '{if (NF<4) print }'


drwx------ glens/glens       0 2010-03-17 10:44 scripts/
-rwxr--r-- glens/www-data 1051 2009-07-27 10:42 scripts/my2cnf.pl
-rwxr--r-- glens/www-data  359 2009-08-14 00:01 scripts/pastebin.sh
-rwxr--r-- glens/www-data  566 2009-07-27 10:42 scripts/critic.pl
-rwxr-xr-x glens/glens     981 2009-12-16 09:39 scripts/wiki_sys.pl
-rwxr-xr-x glens/glens    3072 2009-07-28 10:25 scripts/blacklist_update.pl
-rwxr--r-- glens/www-data 18418 2009-07-27 10:42 scripts/sysinfo.pl

Обязательно обратите внимание, что число равно 3+, сколько угодно уровней, из-за / в имени пользователя / группе. Если вы просто делаете

tar tf scripts.tar | awk -F/ '{if (NF<3) print }'

scripts/
scripts/my2cnf.pl
scripts/pastebin.sh
scripts/critic.pl
scripts/wiki_sys.pl
scripts/blacklist_update.pl
scripts/sysinfo.pl

это всего лишь два.

Возможно, вы могли бы перенаправить вывод ls -R в этот awk скрипт и получить тот же эффект.

6 голосов
/ 23 апреля 2010

Было бы неплохо, если бы мы могли указать команде find заглянуть внутрь файла tar, но я сомневаюсь, что это возможно.

Я бы быстрым и уродливым (и не надежным) способом было бы ограничить количество разделителей каталогов, например:

 $ tar tvf myfile.tar | grep -E '^[^/]*(/[^/]*){1,2}$'

2 предписывает отображать не более 2 косых черт (в моем случае один уже создан разделителем пользователя / группы) и, следовательно, отображать файлы на глубине не более одного Возможно, вы захотите попробовать другие цифры вместо 2.

5 голосов
/ 21 ноября 2016

Другой вариант - archivemount . Вы монтируете это, и компакт-диск в это. Тогда вы можете делать что угодно с этим так же, как с другой файловой системой.

$ archivemount /path/to/files.tgz /path/to/mnt/folder

Кажется, быстрее, чем метод tar.

5 голосов
/ 23 апреля 2010

Я согласен с ответом leonbloy - нет способа сделать это прямо в самом tarball.

Что касается второй части вашего вопроса, ls не имеет опции максимальной глубины. Вы можете набрать все с ls -R, но это часто не очень полезно.

Однако вы можете сделать это как с find, так и с tree. Например, чтобы вывести список файлов и каталогов на один уровень, вы можете сделать

find -maxdepth 2

или

tree -L 2

tree также имеет опцию -d, которая рекурсивно перечисляет каталоги, но не файлы, которые я считаю гораздо более полезными, чем -L, в целом.

...