Здесь я test.tar.gz файла, это структура, как:Баша искать имя файла внутри деготь шара
folder/
folder/folder1
folder/folder1/aa
folder/folder1/bb
folder/folder2
folder/folder2/cc
Есть ли способ, чтобы найти имя папки первого уровня?
Здесь я test.tar.gz файла, это структура, как:Баша искать имя файла внутри деготь шара
folder/
folder/folder1
folder/folder1/aa
folder/folder1/bb
folder/folder2
folder/folder2/cc
Есть ли способ, чтобы найти имя папки первого уровня?
Для простых случаев, как насчет:
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
не является строго необходимо в моем примере, но это помогает, если у вас есть инкрементный архив .
Следует, наверное, указать, что сортировка таким образом означает, что никакой вывод не будет создан до тех пор, пока весь архив tar не будет отсканирован. –
@ EtanReisner Очень правильно. Это может быть проблемой для очень длинных архивов и/или на очень ограниченном оборудовании. –
Да! Посмотрите 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
это еще два.
Выход трубопровода 'ls' свидетельствует о плохих практиках в целом; см. http://mywiki.wooledge.org/ParsingLs –
Не знал этого. Обновлен мой комментарий – Bijan
Использование awk
:
tar -tf bash-4.0.tar.gz | awk -F/'NF > 1 && !a[$1]++ { print $1 FS }'
Выход:
bash-4.0/
Как насчет 'tar cvf stupid.tar folder // folder1': D –
@SylvainLeroux Я сомневаюсь, что это возможно. Но для экстремистов они могут иметь 'awk -F/'NF <= 2 && $ 2 ==" "''. – konsolebox
Это вполне возможно. Я просто тестировал это и собирался опубликовать этот обновленный awk-скрипт. –
Какое имя в этом выходе вы хотите найти? Кроме того, насколько велика тарбол? –