PDF 파일을 재귀적으로 찾아 최적화하고 원래 타임스탬프를 보존하려면 Linux bash 스크립트에 대한 도움이 필요합니다.

PDF 파일을 재귀적으로 찾아 최적화하고 원래 타임스탬프를 보존하려면 Linux bash 스크립트에 대한 도움이 필요합니다.

여기에서 답을 찾으려고 노력했지만 찾지 못했습니다. 영어로 말하는 것이 조금 어렵기 때문에 영어가 서툴러서 죄송합니다. 나는 또한 bash 스크립팅 기술이 거의 또는 전혀 없기 때문에 내 스크립트가 아마도 형편없게 보일 것입니다. 인터넷에서 찾은 예제를 바탕으로 만든 것인데 지금 문제가 있어서 여러분의 도움이 필요합니다!

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

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

Smf-Forum 첨부 파일 디렉터리 구조는 다음과 같습니다.

첨부파일 폴더 아래에는 연도별(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.datps2pdf "$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실패 시 다음 반복으로 점프하려면 다음을 사용할 수 있습니다 .
  • 귀하의 질문이 다른 사람들에게도 도움이 될 수 있도록 보다 설명적인 제목을 사용하십시오.

관련 정보