2010-04-23 27 views
38

Je me demande comment lister le contenu d'un fichier tar seulement jusqu'à un certain niveau?Liste du contenu d'un fichier tar ou d'un répertoire seulement jusqu'à un certain niveau

Je comprends tar tvf mytar.tar lister tous les fichiers, mais parfois je voudrais voir seulement 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 ne montrera que les sous-répertoires directs, mais ne va pas plus loin.

+0

Jetez un coup d'œil à 'tree' pour répertorier plusieurs niveaux de sous-répertoires profonds. – Cameron

+0

On dirait 'tar -tvf mytar.tar | moins »est beaucoup plus facile que la plupart de ces réponses. – Superbest

Répondre

26
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 cependant 3+ plusieurs niveaux que vous voulez, en raison de la/le nom d'utilisateur/groupe. Si vous faites 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 vers ce script awk, et avoir le même effet.

+0

Pouvez-vous expliquer quelle partie de la commande faire quoi? –

5

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.

Je rapide et laid (et non à toute épreuve) façon serait de limiter le nombre de séparateurs de répertoire, par exemple:

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

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

5

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

En ce qui concerne la deuxième partie de votre question, ls n'a pas d'option de profondeur maximale. Vous pouvez recopier 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 lister les fichiers et les répertoires d'un niveau profond, vous pouvez faire

find -maxdepth 2 

ou

tree -L 2 

tree a également une option -d, qui énumère de façon récursive les répertoires, mais pas les fichiers, que je trouve beaucoup plus utile que -L, en général.

+0

True. Et vous pouvez ajouter l'option "-ls" à la commande "find", si vous voulez une sortie similaire à celle de "tar tvf" – leonbloy

80

profondeur = 1

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


profondeur = 2

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

Je rigole, non?! C'est ici, et Awk est choisi comme réponse. ... – ingyhere

+2

Mais cela ne peut obtenir que le nom du fichier, pas le nom du dossier – VicX

+0

Cette réponse est dope. – th3pirat3

0

Une autre option est archiveamount.Vous le montez, et cd dedans. Ensuite, vous pouvez faire n'importe quoi avec tout comme avec les autres systèmes de fichiers.

Il semble plus rapide que la méthode tar.

+0

C'est la meilleure chose que j'ai apprise en une semaine. Thx @Sisyphus – CNSKnight