Если вы используете GNU grep 2.11 или более позднюю версию, -r
запустится из текущего каталога, если каталог не указан:
grep -r --exclude-dir='.*' string
Чтобы получить все имена из верхнего уровня архива 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
Опять же, если бы архив содержал только один каталог на самом верхнем уровне, это вернуло бы его имя.
Используя 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
.