bash cherche le nom de fichier à l’intérieur de la boule de goudron

J’ai ici le fichier test.tar.gz, sa structure est la suivante:

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

Est-il possible de trouver le nom du dossier de premier niveau?

Pour des cas simples, qu’en est-il de:

 tar tf archive.tar | head -1 

… cependant les archives de tar ne sont pas nécessairement “à racine unique”:

 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/ 

En outre, veuillez noter dans l’exemple ci-dessus, les dernières entrées: il y a le sous-dossier, mais pas le dossier racine.

Dans ce cas, vous pouvez extraire les différentes “racines”:

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

Si vous avez aussi besoin de fichiers “non racinés”, c’est plus compliqué:

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

Le sort n’est pas ssortingctement nécessaire dans mon exemple, mais cela aide si vous avez une archive incrémentielle .

Utiliser awk :

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

Sortie:

 bash-4.0/ 

Oui! Jetez un oeil ici

 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 

Assurez-vous de noter que le nombre est supérieur à 3, quel que soit le nombre de niveaux souhaité, à cause du / dans le nom d'utilisateur / groupe. Si tu fais juste

 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 

c'est seulement deux de plus.