페이지 번호를 기준으로 PDF 파일 이름을 일괄 변경합니다.

페이지 번호를 기준으로 PDF 파일 이름을 일괄 변경합니다.

PDF 파일 형식의 논문이 많이 있습니다(같은 폴더에 다른 유형의 파일도 있습니다). 패턴을 사용하여 이름을 바꾸고 싶습니다.

<current file name>[<number of pages>].pdf

하지만 몇 번 시도한 끝에 끝에 중복된 페이지 번호가 있는 잘못된 파일 이름이 많이 생겼습니다. 예를 들어,

Madsen - 분류[48][48].pdf

그래서 저는 이렇게 생각했습니다.

  1. 모든 파일 이름을 정리하고 후행 괄호에 나타나는 숫자를 모두 제거합니다. 예를 들어, 위 파일의 이름을 다음으로 바꿔야 합니다.

Madsen-분류.pdf

  1. [<number of pages>]마지막에 삽입한 모든 파일의 이름을 바꿉니다.

[<number of pages>]이 정보가 없으므로 PDF 파일에서 읽어야 합니다 .

답변1

이것은 원래 문제를 완전히 해결하는 간단한 방법입니다. 한 줄로 작성할 수도 있지만 이 구문을 사용하면 읽을 수 있습니다.

#!/bin/bash
for F in "$@"
do
echo mv "$F" "${F%.pdf}[$(pdfinfo "$F" | awk '/^Pages/{print $NF}')].pdf"
done
$ ls *pdf
aosa-bash.pdf  article.pdf  bash.pdf  bashref.pdf  rose94.pdf
$ find . -name \*.pdf -exec ./pdf.sh {} +
mv ./article.pdf ./article[11].pdf
mv ./bashref.pdf ./bashref[172].pdf
mv ./bash.pdf ./bash[75].pdf
mv ./aosa-bash.pdf ./aosa-bash[14].pdf
mv ./rose94.pdf ./rose94[13].pdf
$

제안된 이름 바꾸기에 만족한다면 mv모든 명령을 셸 창에 붙여넣거나 스크립트를 수정하여 echo mv간단한 mv.

답변2

이름을 바꿔야 하는 pdf 파일의 폴더에 넣을 수 있는 두 개의 스크립트는 다음과 같습니다.

첫 번째는 페이지 번호를 추가하는 데 사용되고 두 번째는 페이지 번호를 삭제하는 데 사용됩니다. 두 스크립트 모두 대화형입니다.

  • 유형입력 중단스크립트를 종료하고,
  • 유형입력하다파일별 대화형 모드로 전환
  • 스크립트를 원하시면확인 없이 모든 PDF 파일을 계속 처리합니다.유형y 입력 y 입력.

file.pdf에 페이지 번호를 추가하는 스크립트(file.pdf -> file[N].pdf)

#!/bin/bash

IFS='
'
ret="not_ok";

renameinteractively () {
for file in *.pdf ; do 
  # derive number of pages in a pdf document
    npages=`pdfinfo $file | grep Pages | awk -e '{print $2}'`;
  # make up a new filename
    file2=${file%%.pdf}[$npages].pdf;
  # an auxiliary variable
    ret="not_ok";

  # interactive part. Ask to rename or not.
    printf "Rename\n $file to \n $file2 ? (y/n/abort) \n";
    until [ $ret == 'ok' ]; do
  # read your answer and y-for rename, n-skip and abort-to exit
      read ans;
      if [ $ans == "y" ]
      then 
          mv $file $file2;
          ret="ok";
          continue;
      elif [ $ans == "n" ]
      then 
          ret="ok";
          break;
      elif [ $ans == "abort" ]
      then 
          exit;
      else
          printf "Enter 'y', 'n' or 'abort', please! \n\n";
      fi
      done;
  done ;
}

renameallofthem () {
until [ $ret == 'ok' ]; do
      if [ $a == "y" ]
      then 
    for file in *.pdf ; do 
      npages=`pdfinfo $file | grep Pages | awk -e '{print $2}'`;
      mv $file ${file%%.pdf}[$npages].pdf; 
      printf "\nMoved \n"
      echo $file
      printf "to\n"
      echo ${file%%.pdf}[$npages].pdf
    done ;
    ret="ok";
    exit;
      elif [ $a == "n" ]
      then 
    printf "\n\n OK, let's do it interactively!\n\n"
    renameinteractively;
      elif [ $a == "abort" ]
      then 
    exit;
      else
    printf "Enter 'y', 'n' or 'abort', please! \n\n";
      fi;
done;
}

printf "Rename ALL of the .pdf files in current folder? (y/n/abort) \n"
read a
if [ $a == "y" ]
then
      printf "Really??\n\n Do we rename ALL of them? (y/n/abort) \n"
      read a
      renameallofthem;
elif [ $a == "n" ]
then 
  printf "\n\n OK, let's do it interactively!!\n\n"
  renameinteractively;
elif [ $a == "abort" ]
then 
    exit;
else
    printf "Enter 'y', 'n' or 'abort', please! \n\n";
fi

파일 [N][N]....[N].pdf (file[N][N]....[N].pdf -> file.pdf)에서 페이지 번호를 삭제하는 스크립트

#!/bin/bash

IFS='
'
deleteNumbersInteractively () {
for file in `ls *].pdf | grep '\[[0-9]*\]'` ; do 
# an auxiliary variable
  ret="not_ok";
# make up a new filename
  file2=`echo $file | sed -e 's/\[[0-9]\+\]//g' `;
# interactive part. Ask to rename or not.    
  printf "Rename\n $file to \n $file2 ? (y/n/abort) \n";
  until [ $ret == 'ok' ]; do
      read ans;
      if [ $ans == "y" ]
      then 
      mv $file $file2;
      ret="ok";
      continue;
      elif [ $ans == "n" ]
      then 
      ret="ok";
      continue;
      elif [ $ans == "abort" ]
      then 
      exit;
      else
      printf "Enter 'y', 'n' or 'abort', please! \n\n";
      fi
  done;
done;
}
deleteAllTheNumbers () {
until [ $ret == 'ok' ]; do
      if [ $a == "y" ]
      then 
    for file in *.pdf ; do 
      file2=`echo $file | sed -e 's/\[[0-9]\+\]//g' `;
      mv $file $file2; 
      printf "\nMoved \n"
      echo $file
      printf "to\n"
      echo $file2
    done ;
    ret="ok";
    exit;
      elif [ $a == "n" ]
      then 
    printf "\n\n OK, let's do it interactively!\n\n"
    deleteNumbersInteractively;
      elif [ $a == "abort" ]
      then 
    exit;
      else
    printf "Enter 'y', 'n' or 'abort', please! \n\n";
      fi;
done;
}


printf "Delete ALL of the filename[NUMBERS].pdf from files in current folder? (y/n/abort) \n"
read a
if [ $a == "y" ]
then
      printf "Really??\n\n Do we rename ALL of them? (y/n/abort) \n"
      read a
      deleteAllTheNumbers;
elif [ $a == "n" ]
then 
  printf "\n\n OK, let's do it interactively!!\n\n"
  deleteNumbersInteractively;
elif [ $a == "abort" ]
then 
    exit;
else
    printf "Enter 'y', 'n' or 'abort', please! \n\n";
fi

이제 다 괜찮나요?

관련 정보