2014-07-23 6 views
2

Здесь я test.tar.gz файла, это структура, как:Баша искать имя файла внутри деготь шара

folder/ 
folder/folder1 
folder/folder1/aa 
folder/folder1/bb 
folder/folder2 
folder/folder2/cc 

Есть ли способ, чтобы найти имя папки первого уровня?

+2

Какое имя в этом выходе вы хотите найти? Кроме того, насколько велика тарбол? –

ответ

8

Для простых случаев, как насчет:

tar tf archive.tar | head -1 

... однако tar архивов не нужно "однокорневые":

sh$ mkdir -p folder/folder1 
sh$ mkdir -p folder/folder2 
sh$ touch folder/folder1/{aa,bb} 
sh$ touch folder/folder2/cc 
sh$ mkdir -p other/folder3 
sh$ touch other/folder3/dd 
sh$ mkdir -p yet/an/other 
sh$ tar cvf f.tar folder other yet/an 
folder/ 
folder/folder1/ 
folder/folder1/aa 
folder/folder1/bb 
folder/folder2/ 
folder/folder2/cc 
other/ 
other/folder3/ 
other/folder3/dd 
yet/an/ 
yet/an/other/ 

Кроме того, обратите внимание, в приведенном выше Например, последние записи: есть подкатегория , но не корневая.

В таком случае, вы можете извлечь различные «корни»:

sh$ tar tf f.tar | sed -n '/^[^/]*\/$/p' 
folder/ 
other/ 

Если вам нужно «некорневых» файлы тоже, это более сложная:

sh$ $ tar tf f.tar | sed -n '/^.*\/$/p' | sort | cut -d '/' -f 1 | uniq 
folder 
other 
yet 

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

+1

Следует, наверное, указать, что сортировка таким образом означает, что никакой вывод не будет создан до тех пор, пока весь архив tar не будет отсканирован. –

+0

@ EtanReisner Очень правильно. Это может быть проблемой для очень длинных архивов и/или на очень ограниченном оборудовании. –

0

Да! Посмотрите Here

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 

это еще два.

+1

Выход трубопровода 'ls' свидетельствует о плохих практиках в целом; см. http://mywiki.wooledge.org/ParsingLs –

+0

Не знал этого. Обновлен мой комментарий – Bijan

3

Использование awk:

tar -tf bash-4.0.tar.gz | awk -F/'NF > 1 && !a[$1]++ { print $1 FS }' 

Выход:

bash-4.0/ 
+0

Как насчет 'tar cvf stupid.tar folder // folder1': D –

+1

@SylvainLeroux Я сомневаюсь, что это возможно. Но для экстремистов они могут иметь 'awk -F/'NF <= 2 && $ 2 ==" "''. – konsolebox

+1

Это вполне возможно. Я просто тестировал это и собирался опубликовать этот обновленный awk-скрипт. –

Смежные вопросы