Question

I wonder how to list the content of a tar file only down to some level?

I understand tar tvf mytar.tar will list all files, but sometimes I would like to only see directories down to some level.

Similarly, for the command ls, how do I control the level of subdirectories that will be displayed? By default, it will only show the direct subdirectories, but not go further.

Was it helpful?

Solution

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

Make sure to note, that the number is 3+ however many levels you want, because of the / in the username/group. If you just do

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

it's only two more.

You could probably pipe the output of ls -R to this awk script, and have the same effect.

OTHER TIPS

depth=1

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


depth=2

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

It would be nice if we could tell the find command to look inside a tar file, but I doubt that is possible.

I quick and ugly (and not foolproof) way would be to limit the number of directory separators, for example:

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

The 2 tells to display not more than 2 slashes (in my case one is already generated by the user/group separator), and hence, to display files at depth at most one. You might want to try with different numbers in place of the 2.

Another option is archivemount. You mount it, and cd into it. Then you can do anything with it just as with other filesystem.

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

It seems faster than the tar method.

I agree with leonbloy's answer - there's no way to do this straightforwardly within the tarball itself.

Regarding the second part of your question, ls does not have a max depth option. You can recurse everything with ls -R, but that's often not very useful.

However you can do this with both find and tree. For example to list files and directories one level deep, you can do

find -maxdepth 2

or

tree -L 2

tree also has a -d option, which recursively lists directories, but not files, which I find much more useful than -L, in general.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top