该命令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}
]
然后,您可以使用jq
和pup
。您的可能性将是无穷无尽的。您甚至可以合并车把输出到模板。
我读了这篇文章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