Bash

如何解碼 base64 編碼的文件名列表?

  • July 18, 2020

我有一個 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一個,而不是作為文件名的單一列表。

只需在每個文件名後添加換行符 () 的 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

因為您需要一個外殼來創建這些管道。但這意味著每個文件執行多個命令,效率非常低。

引用自:https://unix.stackexchange.com/questions/267178