Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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 script и иметь тот же эффект.

Ответ 2

глубина = 1

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


Глубина = 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

find -maxdepth 2

или

tree -L 2

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

Ответ 5

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

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