PDF 파일 형식의 논문이 많이 있습니다(같은 폴더에 다른 유형의 파일도 있습니다). 패턴을 사용하여 이름을 바꾸고 싶습니다.
<current file name>[<number of pages>].pdf
하지만 몇 번 시도한 끝에 끝에 중복된 페이지 번호가 있는 잘못된 파일 이름이 많이 생겼습니다. 예를 들어,
Madsen - 분류[48][48].pdf
그래서 저는 이렇게 생각했습니다.
- 모든 파일 이름을 정리하고 후행 괄호에 나타나는 숫자를 모두 제거합니다. 예를 들어, 위 파일의 이름을 다음으로 바꿔야 합니다.
Madsen-분류.pdf
[<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
이제 다 괜찮나요?