Listing the content of a tar file or a directory only down to some level

前端 未结 5 1705
鱼传尺愫
鱼传尺愫 2020-12-12 15:38

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

相关标签:
5条回答
  • 2020-12-12 16:07

    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.

    0 讨论(0)
  • 2020-12-12 16:17
    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.

    0 讨论(0)
  • 2020-12-12 16:17

    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.

    0 讨论(0)
  • 2020-12-12 16:19

    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.

    0 讨论(0)
  • 2020-12-12 16:26

    depth=1

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


    depth=2

    tar --exclude="*/*/*" -tf file.tar
    
    0 讨论(0)
提交回复
热议问题