我有一个以{base64-encoded part here}_2015-11-12.pdf
.我正在尝试解码该文件列表,并将其作为另一个列表返回到命令行,并以换行符分隔。这就是我现在正在尝试的:
find . -name "*_*" -printf "%f\0" | sed 's/_....-..-..\.pdf//g' | xargs -0 -i echo "{}" | base64 -d
我想我在这里做的是。 。 。
- 查找文件,仅打印出由空字符分隔的文件名(即去掉“./”前缀)
- 使用 sed 仅保留 base64 编码部分(即删除
_2015-11-12.pdf
文件名的部分) - 使用 xargs 表面上将每个文件名传递给 echo
- 然后解码 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
一个技巧是使用\n
base64 进行编码...这样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