【问题标题】:Listing the content of a tar file or a directory only down to some level仅列出某个级别的 tar 文件或目录的内容
【发布时间】:2011-02-11 14:52:48
【问题描述】:

我想知道如何仅列出某个级别的 tar 文件的内容?

我知道tar tvf mytar.tar 会列出所有文件,但有时我希望只查看某个级别的目录。

同样,对于ls这个命令,如何控制子目录的显示级别?默认只显示直接子目录,不显示。

【问题讨论】:

  • 查看tree 以深入列出多个级别的子目录。
  • 似乎tar -tvf mytar.tar | less 比这些答案中的大多数要容易得多。
  • @Cameron 是否支持tree 甚至支持.tar 文件?
  • @brennebeck:我对此表示怀疑;我指的是关于ls的部分。很抱歉造成混乱,我的评论不是很清楚。

标签: bash tar ls depth


【解决方案1】:

我只能使用 grep 显示特定深度的 目录 名称:

对于深度3

tar -tf mytar.tar | grep -Ex '([^/]+/){3}'

或深度$DEPTH

tar -tf mytar.tar | grep -Ex '([^/]+){$DEPTH}/'

您可以通过将@sacapeao 的accepted answer 中的grep--exclude 结合使用来加快速度。

对于深度 3:

tar --exclude '*/*/*/*/*' -tf mytar.tar | grep -Ex '([^/]+/){3}'

【讨论】:

    【解决方案2】:

    另一个选项是archivemount。你挂载它,然后 cd 进入它。然后你可以用它做任何事情,就像其他文件系统一样。

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

    它似乎比 tar 方法更快。

    【讨论】:

      【解决方案3】:

      深度=1

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


      深度=2

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

      【讨论】:

      • 但这只能获取文件名,不能获取文件夹名
      • 这个答案太棒了。
      • 我使用了 depth=1 的解决方案,并在通过将当前目录指定为目标而生成的存档上得到了两个不同的结果。在一个我没有得到任何输出。另一个给出了输出 ./ 。我不知道他们为什么不同。
      • 我认为这只适用于 GNU tar。在 BSD tar(包含在 macOS 中)上,它只列出顶级文件而不是目录。我认为这与 * 被解释为 0 个或更多字符并最终排除任何带有 / 的条目有关。要包含文件和目录,我可以使用模式 "*/?*",对于 depth=2,"*/?*/?*" 可以工作。
      【解决方案4】:
      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
      

      请务必注意,由于用户名/组中的 /,数字是 3+,无论您想要多少级别。如果你只是这样做

      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
      

      只有两个。

      您可能可以将ls -R 的输出通过管道传输到此awk 脚本,并具有相同的效果。

      【讨论】:

      • 这是一个绝妙的答案。但我认为你可以稍微简化一下,因为“打印”是 awk 的默认操作:tar tvf scripts.tar | awk -F/ 'NF&lt;4'
      【解决方案5】:

      如果我们可以告诉find 命令查看 tar 文件内部会很好,但我怀疑这是可能的。

      我快速而丑陋(而不是万无一失)的方法是限制目录分隔符的数量,例如:

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

      2 告诉显示不超过 2 个斜杠(在我的情况下,一个已经由用户/组分隔符生成),因此,最多显示一个深度文件。您可能想尝试用不同的数字代替 2。

      【讨论】:

        【解决方案6】:

        我同意 leonbloy's answer - 无法在 tarball 中直接执行此操作。

        关于您问题的第二部分,ls 没有最大深度选项。您可以使用ls -R 递归所有内容,但这通常不是很有用。

        但是,您可以同时使用 findtree。例如,要列出一层深的文件和目录,您可以这样做

        find -maxdepth 2
        

        tree -L 2
        

        tree 也有一个-d 选项,它递归地列出目录,而不是文件,我发现它比-L 更有用,一般来说。

        【讨论】:

        • 是的。如果您想要类似于“tar tvf”的输出,您可以在“find”命令中添加“-ls”选项
        猜你喜欢
        • 1970-01-01
        • 2018-03-03
        • 2013-10-21
        • 2013-03-17
        • 1970-01-01
        • 2022-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多