
나는 이미 여기서 답을 찾으려고 노력했지만 찾지 못했습니다. 영어가 서툴러서 미안해요. 영어로 말하는 게 좀 어렵거든요. 나는 또한 bash 스크립팅 기술이 거의 없기 때문에 내 스크립트가 매우 나빠 보일 수 있습니다. 인터넷에서 찾은 예제를 바탕으로 만든 것입니다. 하지만 지금은 이것에 대해 벽에 부딪혀서 여러분의 도움이 필요합니다!
이 스크립트에서 필요한 것은 다음과 같습니다.
- 모든 PDF 파일을 재귀적으로 찾습니다(Simple Machines Forum은 첨부 파일을 해시하므로 확장자는 .dat입니다).
- .dat 파일에서 PDF 유형 식별
- 그런 다음 ps2pdf 프로그램을 사용하여 모든 새로운(지난 24시간) PDF 파일을 최적화해야 합니다.
- 또한 최적화된 PDF 파일의 원본 타임스탬프를 유지해야 합니다.
- 해당 "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가 다른 사람들에게도 도움이 될 수 있습니다.