格式化 Unix 密码存储 ls 输出

Posted

技术标签:

【中文标题】格式化 Unix 密码存储 ls 输出【英文标题】:Formatting Unix password store ls output 【发布时间】:2021-09-22 12:22:06 【问题描述】:

我只是想自动化一些过程,我需要能够格式化来自pass ls的输出

https://www.passwordstore.org 的列表命令是什么

当前输出如下所示:

➜  ~ pass ls
Password Store
├── README.md
├── folder
│   └── subfolder
│       └── subfolder2
│           └── key1
│           └── key2
│           └── key3
├── anotherfolder
│   ├── subfolder
│   │   └── subfolder2
│   │       └── subfolder3
│   │           └── key1
│   │           └── key2
│   │           └── key3

我希望输出看起来像:

 ➜  ~ pass ls | some magic sed/grep/replace/etc
folder/subfolder/subfolder2/key1
folder/subfolder/subfolder2/key2
folder/subfolder/subfolder2/key3
anotherfolder/subfolder/subfolder2/subfolder3/key1
anotherfolder/subfolder/subfolder2/subfolder3/key2
anotherfolder/subfolder/subfolder2/subfolder3/key3

我正在尝试使用 sed 这样做,但随着子文件夹级别的加深(例如文件夹/子文件夹/子文件夹/子文件夹/键),无法替换不断增加的空格/制表符

这是我目前正在尝试的:

pass ls | sed -e 's/├──[ \t]*/\\/g' | sed -e 's/│   └──[ \t]*/\\/g'

评论后编辑:

好像pass ls只是密码存储目录上的一个简单的tree命令,所以我可以在我的目录上运行find来实现我想要的上述格式

我试试,题目的范围可以改成:

可以产生上述格式的正确列表命令是什么?

【问题讨论】:

老实说,将pass 本身修补为具有设计为易于解析(JSON 等)的输出格式作为选项不是更简单更健壮吗?这样您就不必担心未来的版本会稍微改变格式并无意中破坏您的逻辑。 文档说它使用tree(1) 进行格式化,我认为这意味着您理论上可以在某处使用find 的目录。 (该目录可能是pass 内部的一个短暂的临时文件系统,在这种情况下pass 本身需要提供接口。) 嗯。如果它通过 PATH 查找找到 tree,这很容易覆盖,在运行期间暂时将运行 find 的您自己的 tree 版本放在 PATH 的首位... 我很惊讶pass 还没有提供这样的输出,因为它声称遵循 Unix 哲学。 哦,我误读了pass 的工作原理;我在想整个商店都是一个 GPG 文件。我敢打赌,您完全可以不使用pass 来执行find <yourdirectory> -type f 之类的操作。 【参考方案1】:
find . -type d -name '.git' -prune -o -name '*.gpg' -type f -print

为我做了诀窍,它排除了.git 目录中的所有文件,并且只打印带有.gpg 扩展名的文件(这是实际的键)

【讨论】:

看起来您可以将其封装在一个 shell 脚本中以转换为 pass extension。

以上是关于格式化 Unix 密码存储 ls 输出的主要内容,如果未能解决你的问题,请参考以下文章

1.4 常用UNIX/Linux命令 -文件目录命令

需要在unix中格式化两个unl文件

Unix list 命令 'ls' 可以输出数字 chmod 权限吗?

ls的-l选项(长格式列表输出)

为什么以太网密钥库密文 以十六进制字符串格式存储,长度仅为64?

设置存储免密码登录