PDF 파일이 여러 개 있는데 모두 "READING nn"이라는 문자열을 포함하고 있습니다. 여기서 nn은 해당 판독값의 번호입니다. 각 문자 사이에는 "READING 1 0"이라는 공백이 정확히 1개 있습니다.
각 파일에서 숫자 n을 검색하고 해당 숫자를 파일 시작 부분에 추가하는 bash 스크립트를 작성하고 싶습니다. 예를 들어 스크립트가 name.pdf에서 "READING 1"을 찾으면 파일 이름을 1.name.pdf 등으로 바꿔야 합니다.
어떻게 하나요?
감사해요
답변1
귀하의 질문에 대한 대답은 이 문자열이 발생할 수 있는지 여부에 따라 다릅니다.한 번또는 고려 중인 PDF 파일 내에서 여러 번. 한 번만 일어날 수 있다고 가정하면,그리고문제의 문자열은 실제 텍스트(즉, 그래픽 형식이 아님)로 포함되어 있으며 다음 접근 방식(GNU Awk 및 외부 도구 필요 pdftotext
)이 작동해야 합니다(예제는 인수로 전달된 단일 파일에 대해 작동합니다).
#!/bin/bash
OLDNAME="$1"
NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"
NEWNAME="$NUMBER.$OLDNAME"
mv "$OLDNAME" "$NEWNAME"
match
특정 패턴이 존재 하는지 확인 awk
하고 해당 패턴의 "실제 값"을 출력 배열로 출력합니다. a
여기서 항목 에는 a[0]
발견된 전체 패턴이 포함되고 패턴에서 괄호로 묶인 하위 표현식의 "실제 값"이 a[1]
포함됩니다 . a[n]
우리의 경우 배열 항목 1과 2의 "숫자 부분"입니다 ([[:digit:]])( [[:digit:]])*
(예:GNU Awk 사용자 가이드의 "문자열 함수" 섹션). 결과가 한 자릿수인 경우에는 a[2]
비워 두어도 상관없습니다. 두 자리 숫자의 경우 숫자 사이의 공백도 일치하므로 두 자리 숫자의 경우 awk
s 함수를 사용하여 이를 제거합니다.gsub()
여러 파일에 적용하려면 다음과 같이 스크립트를 수정하고 PDF 파일의 전체 목록을 매개변수(예: ./rename.sh *.pdf
)로 전달하면 됩니다.
#!/bin/bash
for OLDNAME in "$@"
do
NUMBER="$(pdftotext "$OLDNAME" - | awk '/R E A D I N G/ {match($0,"R E A D I N G ([[:digit:]])( [[:digit:]])*",a); gsub(" ","",a[2]); print a[1] a[2];}')"
NEWNAME="$NUMBER.$OLDNAME"
mv "$OLDNAME" "$NEWNAME"
done