大型档案的 atool -l 输出

大型档案的 atool -l 输出

该命令atool -l my_archive将目录结构和文件打印my_archive到命令行。如果存档仅包含几个文件,这非常方便。但是,如果文件和目录很多,输出很快就会变得混乱。

有没有办法“控制”这个输出,例如只显示顶层的文件和目录?

如果有必要,我也愿意切换到另一个命令。理想情况下,我希望有一个命令,默认情况下只打印顶层的文件和目录,并允许我(使用自动完成)导航到子目录中。示例:假设顶层my_archive包含文件夹 A 和文件 f,并且 A 有子目录 B 和 C。那么

atool -l my_archive

应该打印 A 和 f(我应该能够从输出中看出 A 是一个目录)。如果我想检查 A,我会输入

atool -l my_archive/A

并且它应该打印 B 和 C。

是否存在这样的事情或者是否有可能atool -l通过上述方式进行调整?

编辑:这是输出的一个例子atool -l

-rw-r--r-- 2012/2012       143 2020-07-29 11:35 dokuwiki/vendor/.htaccess
-rw-r--r-- 2012/2012       213 2020-07-29 11:35 dokuwiki/vendor/README
-rw-r--r-- 2012/2012       178 2020-07-29 11:35 dokuwiki/vendor/autoload.php
-rw-r--r-- 2012/2012      7255 2020-07-29 11:35 dokuwiki/vendor/aziraphale/email-address-validator/EmailAddressValidator.php
-rw-r--r-- 2012/2012      2624 2020-07-29 11:35 dokuwiki/vendor/aziraphale/email-address-validator/README.md
-rw-r--r-- 2012/2012     13459 2020-07-29 11:35 dokuwiki/vendor/composer/ClassLoader.php
-rw-r--r-- 2012/2012      1070 2020-07-29 11:35 dokuwiki/vendor/composer/LICENSE
-rw-r--r-- 2012/2012      2532 2020-07-29 11:35 dokuwiki/vendor/composer/autoload_classmap.php
-rw-r--r-- 2012/2012       451 2020-07-29 11:35 dokuwiki/vendor/composer/autoload_files.php
-rw-r--r-- 2012/2012       310 2020-07-29 11:35 dokuwiki/vendor/composer/autoload_namespaces.php
-rw-r--r-- 2012/2012       380 2020-07-29 11:35 dokuwiki/vendor/composer/autoload_psr4.php
-rw-r--r-- 2012/2012      2476 2020-07-29 11:35 dokuwiki/vendor/composer/autoload_real.php
-rw-r--r-- 2012/2012      4892 2020-07-29 11:35 dokuwiki/vendor/composer/autoload_static.php
-rw-r--r-- 2012/2012     16994 2020-07-29 11:35 dokuwiki/vendor/composer/installed.json

答案1

我发现了一点混乱的情况。

atool -l your_archive | tree --fromfile .

这看起来就像您真正需要的一切,但这些额外的东西构成了答案。

atool *zip | tree --fromfile . | awk '{ for (i = 2; i <= NF; i++) printf "%s ", $i; print "" }'

您确实可以使用awk列来自定义输出。删除tree从第 2 列开始的初始分支对输出有很大帮助。

文件名通常跨越好几列,因此NF只需转到最后一列即可。您可以轻松截断长文件名,将文件名更改NF为列号。例如(i = 2; i <= 8; i++)

如果您真的想深入了解它,完全可定制,您可以使用-J输出为 JSON。

als *tar | tree --fromfile . -J
[
  {"type":"directory","name":".","contents":[
    {"type":"directory","name":"drwxr-xr-x jason","contents":[
      {"type":"directory","name":"jason       0 2023-06-06 16:03 0n_git","contents":[
## truncated for brevity ##
      ]},
      {"type":"directory","name":"jason     282 2023-06-06 15:31 0n_git","contents":[
        {"type":"directory","name":"shellscripts","contents":[
          {"type":"file","name":"sshot.sh"}
        ]}
      ]}
    ]}
  {"type":"report","directories":26,"files":9}
]

然后,您可以使用jqpup。您的可能性将是无穷无尽的。您甚至可以合并车把输出到模板。


我读了这篇文章Kamil Maciorowski 的评论并对其进行了扩展。

从存储库安装archivemount& nnn。这正是您想要的:

#!/bin/bash

# check file argument is not empty 
if [ "$#" -eq 0 ]; then
    echo "Usage: $0 <archive_file>"
    exit 1
fi

# prepare file for mount
archive_file="$1"
unique_id=$(tr -dc 'a-zA-Z0-9' < /dev/urandom | fold -w 5 | head -n 1)
mount_point="/tmp/archive-$unique_id"
mkdir -p "$mount_point"

# mount archive
archivemount "$archive_file" "$mount_point" -o readonly -o auto_unmount -o auto_cache

# browse archive using nnn & cleanup on exit
if [ $? -eq 0 ]; then
    nnn "$mount_point"
    fusermount -u "$mount_point"
    rmdir "$mount_point"
else
    echo "Failed to mount the archive."
fi

exit 0

保存到:archive_explore.sh
将模式更改为可执行:chmod +x archive_explore.sh
用法:./archive_explore.sh your_archive

相关内容