{base64-encoded part here}_2015-11-12.pdf
のパターンでbase64でエンコードされたファイル名のリストがあります。そのファイルのリストをデコードして、コマンドラインで改行で区切られた別のリストとして返します。これが私が今試していることです:
find . -name "*_*" -printf "%f\0" | sed 's/_....-..-..\.pdf//g' | xargs -0 -i echo "{}" | base64 -d
私がここでやっていることはだと思います。 。 。
_2015-11-12.pdf
部分を削除します)その結果、base64でデコードされたすべてのファイル名の大きな文字列になります。各名前はヌル文字で区切られ、文字列全体の後に改行が続きます。 desiredの結果は、それ自体が1行にある個々のデコードされたファイル名になります。
私はこれを修正するためにあらゆる種類のトリックを試しましたが、うまくいくものは何も見つかりませんでした。私は... | base64 -d | echo
、... | base64 -d && echo
などを試し、途中のさまざまなポイントに改行を挿入しようとしました。値が| base64 -d
になるまでに、すべてが1つの文字列として一度に処理されるようです。ファイル名のモノリシックリストとしてではなく、各値を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
これらのパイプラインを作成するにはシェルが必要です。しかし、これはファイルごとにいくつかのコマンドを実行することを意味し、これは非常に非効率的です。
1つのトリックは、base64で\n
をエンコードすることです...これはCg==
になり、printfコマンドに追加できます。 '\'をファイル名に含めることはできません。結局、それを元に戻すことができます
find . -name "*_*" -printf "%f\0Cg==" | sed 's/_....-..-..\.pdf//g' | xargs -0 -i echo "{}" | base64 -d | sed 's/\\n/\n/g'