Bash
如何解碼 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
我想我在這裡做的是。. .
- 查找文件,僅列印出文件名(即去掉“./”前綴),以空字元分隔
- 使用 sed 僅保留 base64 編碼的部分(即,刪除
_2015-11-12.pdf
文件名的部分)- 使用 xargs 表面上將每個文件名傳遞給 echo
- 然後解碼 echo 返回的值。
結果顯然是一個包含所有 base64 解碼文件名的大字元串,每個名稱由一個空字元分隔,整個字元串後跟一個換行符。所需的結果將是單獨一行中的每個單獨的解碼文件名。
我已經嘗試了各種技巧來嘗試解決這個問題,但我沒有找到任何有效的方法。我嘗試過
... | base64 -d | echo
,... | base64 -d && echo
等,試圖在沿途的各個點插入換行符。似乎到值結束時| base64 -d
,它們都被一次處理,作為一個字元串。我正在嘗試找到一種方法將每個值一次發送到base64 -d
一個,而不是作為文件名的單一列表。
只需在每個文件名後添加換行符 () 的 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
因為您需要一個外殼來創建這些管道。但這意味著每個文件執行多個命令,效率非常低。