如何解码 Base64 编码的文件名列表?

如何解码 Base64 编码的文件名列表?

我有一个以{base64-encoded part here}_2015-11-12.pdf.我正在尝试解码该文件列表,并将其作为另一个列表返回到命令行,并以换行符分隔。这就是我现在正在尝试的:

find . -name "*_*" -printf "%f\0" | sed 's/_....-..-..\.pdf//g' | xargs -0 -i echo "{}" | base64 -d

我想我在这里做的是。 。 。

  1. 查找文件,仅打印出由空字符分隔的文件名(即去掉“./”前缀)
  2. 使用 sed 仅保留 base64 编码部分(即删除_2015-11-12.pdf文件名的部分)
  3. 使用 xargs 表面上将每个文件名传递给 echo
  4. 然后解码 echo 返回的值。

其结果显然是一个由所有 Base64 解码的文件名组成的大字符串,每个名称都用空字符分隔,整个字符串后跟一个换行符。这期望结果将是单独一行上的每个单独的解码文件名。

我尝试了各种技巧来尝试解决这个问题,但我还没有找到任何有效的方法。我已经尝试过... | base64 -d | echo... | base64 -d && echo等等,尝试在沿途的各个点插入换行符。似乎当值结束时| base64 -d,它们都被作为单个字符串立即处理。我正在尝试找到一种方法将每个值base64 -d一次发送给一个值,而不是作为单一的文件名列表。

答案1

只需在每个文件名后添加换行符 () 的 Base64 编码Cg==,并将整个文件通过管道传输到base64 -d

find . -name "*_*" -printf "%f\n" |
  sed -n 's/_....-..-..\.pdf$/Cg==/p' |
  base64 -d

按照你的方法,那必须是这样的:

find . -name "*_*" -printf "%f\0" |
  sed -zn 's/_....-..-..\.pdf$//p' |
  xargs -r0 sh -c '
    for i do
      echo "$i" | base64 -d
    done' sh

因为您需要一个外壳来创建这些管道。但这意味着每个文件运行多个命令,效率非常低。

答案2

一个技巧是使用\nbase64 进行编码...这样Cg==您就可以将其附加到 printf 命令中。文件名中不能包含“\”。所以最后你可以将其返回

find . -name "*_*" -printf "%f\0Cg==" | sed 's/_....-..-..\.pdf//g' | xargs -0 -i echo "{}" | base64 -d | sed 's/\\n/\n/g'

答案3

Bash 有一个漂亮的 here-document <<<,它可以让你使用 xargs 管道传输多行。

❯ echo -e "T0sK\nT0sK" | xargs -n1 bash -c 'base64 -d <<< $1' _
OK
OK

相关内容