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모두 즉시 하나의 문자열로 처리되는 것 같습니다. 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에는 xargs를 사용하여 여러 줄을 파이프할 수 있는 멋진 here-document가 있습니다 .

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

관련 정보