Список содержимого файла tar или каталога только до некоторого уровня
Интересно, как перечислить содержимое tar файла только до некоторого уровня?
Я понимаю, что tar tvf mytar.tar
будет перечислять все файлы, но иногда мне хотелось бы видеть только директории до некоторого уровня.
Аналогично, для команды ls
, как я могу контролировать уровень подкаталогов, которые будут отображаться? По умолчанию он будет показывать только прямые подкаталоги, но не идти дальше.
Ответы
Ответ 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.