Linux bash 스크립트에 대한 도움이 필요합니다. pdf 파일을 재귀적으로 찾아서 최적화하고, 원본 타임스탬프를 유지하세요.

Linux bash 스크립트에 대한 도움이 필요합니다. pdf 파일을 재귀적으로 찾아서 최적화하고, 원본 타임스탬프를 유지하세요.

나는 이미 여기서 답을 찾으려고 노력했지만 찾지 못했습니다. 영어가 서툴러서 미안해요. 영어로 말하는 게 좀 어렵거든요. 나는 또한 bash 스크립팅 기술이 거의 없기 때문에 내 스크립트가 매우 나빠 보일 수 있습니다. 인터넷에서 찾은 예제를 바탕으로 만든 것입니다. 하지만 지금은 이것에 대해 벽에 부딪혀서 여러분의 도움이 필요합니다!

이 스크립트에서 필요한 것은 다음과 같습니다.

  1. 모든 PDF 파일을 재귀적으로 찾습니다(Simple Machines Forum은 첨부 파일을 해시하므로 확장자는 .dat입니다).
  2. .dat 파일에서 PDF 유형 식별
  3. 그런 다음 ps2pdf 프로그램을 사용하여 모든 새로운(지난 24시간) PDF 파일을 최적화해야 합니다.
  4. 또한 최적화된 PDF 파일의 원본 타임스탬프를 유지해야 합니다.
  5. 해당 "24h-pdf-compress-" date +"%d-%m-%Y"".txt" 파일은 로깅에만 사용되므로 나중에 작동하는지 확인할 수 있습니다.

Smf- 포럼 첨부 파일 디렉토리 구조는 다음과 같습니다:

첨부파일 아래에는 연도별(2020년) 폴더가 있습니다.
매년 아래에는 월(04 = 4월) 폴더가 있습니다.
매월 아래에는 해당 달의 모든 첨부 파일이 있습니다.
모든 파일(jpg,png,pdf)은 동일한 .dat 확장자를 갖습니다.

/var/www/foorumi/attachments/2020/04/all-files-from-april.dat

내 스크립트:

#!/bin/bash

cd /var/www/foorumi/attachments

find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1 > "24h-pdf-compress-"`date +"%d-%m-%Y"`".txt"
find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1 | while read -r file

do
        touch -r "$file" "dummy_file"
        ps2pdf "$file" "new_$file" # PROBLEM
        rm "$file"
        mv "new_$file" "$file" # PROBLEM
        touch -r "dummy_file" "$file"
        rm dummy_file
done

mv "24h-pdf-compress-"`date +"%d-%m-%Y"`".txt" /root/24h_pdf_compress_log
find . -iname '*.dat' -user root -exec chown www-data:www-data {} \;

exit 0

문제는 다음과 같습니다. 실행하면 find . -name '*.dat' -mtime -1 | xargs file -i | grep 'pdf' | cut -d: -f1과 같은 파일이 인쇄되므로 ./04/somepdfattachment.dat스크립트가 실행될 때 .. ps2pdf "$file" "new_$file"와 같은 새 파일 이름을 만들려고 시도하는 것이 new_./04/somepdfattachment.dat올바르지 않습니다.

스크립트가 file 이름을 바꾸려고 할 때 다음 오류가 발생합니다 . 이제 파일 이름을 원래 파일 이름으로 다시 mv "new_$file" "$file"바꾸려고 하기 때문입니다 .new_./04/somepdfattachment.dat

내가 말하려는 내용을 이해하시기 바랍니다. 필요한 경우 추가 정보를 제공할 수 있습니다.

미리 감사드립니다!

업데이트! @pLumo가 제안한 것처럼 스크립트를 수정했는데 이제 작동하는 것 같습니다. 제안 사항을 올바르게 이해했으면 좋겠습니다.

Simple Machines 포럼 첨부 파일의 이름은 다음과 같이 지정됩니다. 403_57066cef00fb1d57137b5613f076d254e89b88bc.dat
"403" = 첨부 파일의 실행 번호, 다음은 404, 다음은 405 등입니다..
"57066cef00..." = 무작위 해시
".dat"= 모든 첨부 파일 입니다. 확장자(jpg,png,pdf)는 업로드 후 .dat로 이름이 변경됩니다.

업데이트된 스크립트:

...
do
        touch -r "$file" "dummy_file"
        newname="$(dirname "$file")/new_$(basename "$file")"
        ps2pdf "$file" "$newname" || continue
        rm "$file"
        mv "$newname" "$file"
        touch -r "dummy_file" "$file"
        rm dummy_file
done
...

답변1

$file경로( dirname)와 파일 이름( basename) 으로 분할 하고 new_다음 사이에 넣어야 합니다.

newname="$(dirname "$file")/new_$(basename "$file")"
ps2pdf "$file" "$newname"

추가 힌트:

  • find결과에 개행 문자가 있으면 명령이 안전하지 않아 결과가 망가질 수 있습니다 . 파일 이름을 안전하게 파이프하려면 0 구분 기호에 익숙해지는 것이 좋습니다.
  • 파일 이름에 콜론이 있는 경우에도 마찬가지이며 cut잘못된 위치에서 분할됩니다.
  • -exec다음 대신 사용하세요 xargs:find . -name '*.dat' -mtime -1 -exec file -i {} +
  • 실패 하면 ps2pdf계속해서 원본 파일을 삭제합니다. 예를 들어 ps2pdf ... || continue실패 시 다음 반복으로 점프하는 데 사용할 수 있습니다 .
  • 좀 더 설명적인 제목을 사용하면 Q가 다른 사람들에게도 도움이 될 수 있습니다.

관련 정보