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.
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.
profondeur = 1
tar --exclude="*/*" -tf file.tar
profondeur = 2
tar --exclude="*/*/*" -tf file.tar
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.
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.
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.