여기에서 답을 찾으려고 노력했지만 찾지 못했습니다. 영어로 말하는 것이 조금 어렵기 때문에 영어가 서툴러서 죄송합니다. 나는 또한 bash 스크립팅 기술이 거의 또는 전혀 없기 때문에 내 스크립트가 아마도 형편없게 보일 것입니다. 인터넷에서 찾은 예제를 바탕으로 만든 것인데 지금 문제가 있어서 여러분의 도움이 필요합니다!
이 스크립트에서 필요한 것은 다음과 같습니다.
- 모든 PDF 파일을 재귀적으로 찾습니다(Simple Machine Forum은 첨부 파일을 해시하므로 확장자가 .dat입니다).
- .dat 파일에서 PDF 유형 식별
- 그런 다음 ps2pdf 프로그램을 사용하여 모든 새로운(지난 24시간) PDF 파일을 최적화해야 합니다.
- 또한 최적화된 PDF 파일의 원래 타임스탬프를 보존해야 합니다.
- "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.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
실패 시 다음 반복으로 점프하려면 다음을 사용할 수 있습니다 .- 귀하의 질문이 다른 사람들에게도 도움이 될 수 있도록 보다 설명적인 제목을 사용하십시오.