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すべてすぐに1つの文字列として扱われるようです。base64 -d単一のファイル名のリストではなく、各値を一度に1つずつ送信する方法を見つけようとしています。

答え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

\n1つの秘密は、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には、xargsを使用して複数行をパイプすることができる素晴らしいhere-documentがあります。

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

関連情報