web-dev-qa-db-fra.com

Lister le contenu d'un fichier tar ou d'un répertoire uniquement jusqu'à un certain niveau

Je me demande comment lister le contenu d'un fichier tar uniquement jusqu'à un certain niveau?

Je comprends tar tvf mytar.tar listera tous les fichiers, mais parfois je voudrais seulement voir les répertoires jusqu'à un certain niveau.

De même, pour la commande ls, comment contrôler le niveau des sous-répertoires qui seront affichés? Par défaut, il n'affichera que les sous-répertoires directs, mais n'ira pas plus loin.

51
Tim
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 ou égal à 3 niveaux, à 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.

Vous pourriez probablement diriger la sortie de ls -R à ce script awk, et ont le même effet.

31
Glen Solsberry

profondeur = 1

tar --exclude="*/*" -tf file.tar


profondeur = 2

tar --exclude="*/*/*" -tf file.tar
128
sacapeao

Ce serait bien si nous pouvions dire à la commande find de regarder à l'intérieur d'un fichier tar, mais je doute que ce soit possible.

La manière rapide et laide (et non infaillible) serait de limiter le nombre de séparateurs de répertoires, par exemple:

 $ tar tvf myfile.tar | grep -E '^[^/]*(/[^/]*){1,2}$'

Le 2 indique d'afficher pas plus de 2 barres obliques (dans mon cas, une est déjà générée par le séparateur utilisateur/groupe), et donc d'afficher les fichiers en profondeur au plus un. Vous voudrez peut-être essayer avec des numéros différents à la place des 2.

6
leonbloy

Je suis d'accord avec réponse de leonbloy - il n'y a aucun moyen de le faire directement dans l'archive elle-même.

Concernant la deuxième partie de votre question, ls n'a pas d'option de profondeur max. Vous pouvez récuser tout avec ls -R, mais ce n'est souvent pas très utile.

Cependant, vous pouvez le faire avec find et tree. Par exemple, pour répertorier les fichiers et les répertoires d'un niveau, vous pouvez faire

find -maxdepth 2

ou

tree -L 2

tree possède également un -d option, qui répertorie récursivement les répertoires, mais pas les fichiers, ce que je trouve beaucoup plus utile que -L, en général.

5
ire_and_curses

Une autre option est archivemount . Vous le montez et vous y insérez un CD. Ensuite, vous pouvez tout faire avec comme avec les autres systèmes de fichiers.

$ archivemount /path/to/files.tgz /path/to/mnt/folder

Cela semble plus rapide que la méthode tar.

5
Sisyphus