로 시작하는 파일 목록이 있습니다 {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
단일 파일 이름 목록이 아닌 각 값을 한 번에 하나씩 보내는 방법을 찾으려고 노력 중입니다 .
답변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