Similarly to `pass find --find`, this flag changes the `pass ls` command
to use find(1) instead of tree(1).

With this flag, the output is directly usable in a subsequent call to
`pass show`.

Examples of use:

        $ pass find --find kernel \
          | tail -n -1 \
          | xargs ./password-store.sh ls --find;
        www/foss/kernel/
        www/foss/kernel/smtp/
        www/foss/kernel/smtp/pass
        www/foss/kernel/bugzilla/
        www/foss/kernel/bugzilla/url
        www/foss/kernel/bugzilla/alx/
        www/foss/kernel/bugzilla/alx/id
        www/foss/kernel/bugzilla/alx/pass

        $ pass find --find kernel \
          | tail -n -1 \
          | xargs pass ls --find \
          | tail -n1 \
          | xargs pass show;
        pw

Signed-off-by: Alejandro Colomar <[email protected]>
---

And here's a patch for pass ls.  These patches apply on top of the
formatting fixes for the manual page that I sent earlier.

Cheers,
Alex

 man/pass.1            | 15 +++++++++++++++
 src/password-store.sh | 20 ++++++++++++++------
 2 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/man/pass.1 b/man/pass.1
index b9764c5..2f4d858 100644
--- a/man/pass.1
+++ b/man/pass.1
@@ -92,6 +92,21 @@ .SH COMMANDS
 .BR tree (1)
 program.
 This command is alternatively named \fBlist\fP.
+If the
+.I \-\-find
+flag is used,
+.BR find (1)
+is used instead;
+this is useful to be able to reuse the output as an input to
+.IR "pass show" .
+Here's an example:
+.IP
+.in +4n
+.EX
+$ pass ls \-\-find foo/bar/ | tail \-n1 | xargs pass show
+.EE
+.in
+.TP
 .TP
 \fBgrep\fP [\fIGREPOPTIONS\fP] \fIsearch-string\fP
 Searches inside each decrypted password file for \fIsearch-string\fP, and 
displays line
diff --git a/src/password-store.sh b/src/password-store.sh
index bf0e446..966c245 100755
--- a/src/password-store.sh
+++ b/src/password-store.sh
@@ -366,11 +366,12 @@ cmd_init() {
 }
 
 cmd_show() {
-       local opts selected_line clip=0 qrcode=0
-       opts="$($GETOPT -o q::c:: -l qrcode::,clip:: -n "$PROGRAM" -- "$@")"
+       local opts selected_line clip=0 find=0 qrcode=0
+       opts="$($GETOPT -o q::c:: -l qrcode::,clip::,find -n "$PROGRAM" -- 
"$@")"
        local err=$?
        eval set -- "$opts"
        while true; do case $1 in
+               --find) find=1; shift ;;
                -q|--qrcode) qrcode=1; selected_line="${2:-1}"; shift 2 ;;
                -c|--clip) clip=1; selected_line="${2:-1}"; shift 2 ;;
                --) shift; break ;;
@@ -397,12 +398,19 @@ cmd_show() {
                        fi
                fi
        elif [[ -d $PREFIX/$path ]]; then
-               if [[ -z $path ]]; then
-                       echo "Password Store"
+               if [[ $find -eq 1 ]]; then
+                       local n="$(echo "$PREFIX" | wc -c)"
+
+                       find -L "$PREFIX/$path" | sed '/[^\/]$/s,$,/,' | sed 
"s/^.\{$n\}//" | sed 's,\.gpg/$,,'
                else
-                       echo "${path%\/}"
+                       if [[ -z $path ]]; then
+                               echo "Password Store"
+                       else
+                               echo "${path%\/}"
+                       fi
+
+                       tree -N -C -l --noreport "$PREFIX/$path" 3>&- | tail -n 
+2 | sed -E 's/\.gpg(\x1B\[[0-9]+m)?( ->|$)/\1\2/g' # remove .gpg at end of 
line, but keep colors
                fi
-               tree -N -C -l --noreport "$PREFIX/$path" 3>&- | tail -n +2 | 
sed -E 's/\.gpg(\x1B\[[0-9]+m)?( ->|$)/\1\2/g' # remove .gpg at end of line, 
but keep colors
        elif [[ -z $path ]]; then
                die "Error: password store is empty. Try \"pass init\"."
        else
-- 
2.40.1

Reply via email to