Нерекурсивный список tar

Если вы используете GNU grep 2.11 или более позднюю версию, -rзапустится из текущего каталога, если каталог не указан:

grep -r --exclude-dir='.*' string
-1
19.08.2019, 12:45
2 ответа

Чтобы получить все имена из верхнего уровня архива tar:

tar -tf archive.tar | cut -d '/' -f 1 | sort -u

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

Если верхние -имена уровней содержат новые строки, то результат будет зависеть от того, tarкакая реализация используется (вы получите строку с закодированным символом новой строки(\n)с GNUtar(GNU tarтакже будет кодировать табуляцию и, возможно, другие символы в именах )и две отдельные строки из BSDtar).

Пример:

$ tar -tf archive.tar
README.txt
source
source/program.c
$ tar -tf archive.tar | cut -d '/' -f 1 | sort -u
README.txt
source

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

1
28.01.2020, 05:08

Используя gnuchess-6.2.5.tar.gzв качестве примера, чтобы получить только имя корневого каталога:

[David@Fedora64 projects]$ tar -tf gnuchess-6.2.5.tar.gz | grep -e "\/$" | head -n1
gnuchess-6.2.5/
[David@Fedora64 projects]$ 

И если это ничего не делает, как в случае с файлом, структурированным как mediawiki-1.33.0.tar.gz, вы можете получить имя корневого каталога, просто взглянув на первую строку из файла tar:

[David@Fedora64 Downloads]$ tar -tf mediawiki-1.33.0.tar.gz | head -n1
mediawiki-1.33.0/.phan/config.php
[David@Fedora64 Downloads]$ 

...где корневой каталог виден как mediawiki-1.33.0.

1
28.01.2020, 05:08

Теги

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