ここで答えを見つけようとしましたが、見つかりませんでした。英語で話すのは少し難しいので、英語が苦手で申し訳ありません。私はまた、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
次のエラーは、スクリプトがファイルの名前を変更しようとしたときに発生します。これで、ファイルの名前を元のファイル名に戻したいmv "new_$file" "$file"
と思います。new_./04/somepdfattachment.dat
私が言いたいことを理解してください。必要に応じて追加情報を提供できます。
よろしくお願いします!
書き直す! @pLumoの提案に従ってスクリプトを修正しましたが、これはうまくいくようです。アドバイスを正しく理解したことを願っています。
Simple Machinesフォーラム
の添付ファイルの名前は次のとおりです 。 . "=すべての添付ファイル拡張子(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
結果に改行文字があると、コマンドは安全ではなく結果が混乱します。ファイル名を安全にパイプするには、ゼロ区切り文字に慣れることをお勧めします。- ファイル名にコロンがある場合も同じだと思います。ファイルは
cut
間違った場所に分割されます。 -exec
代わりに使用してくださいxargs
:find . -name '*.dat' -mtime -1 -exec file -i {} +
ps2pdf
失敗しても、引き続き元のファイルを削除できます。たとえば、ps2pdf ... || continue
失敗したときに次の繰り返しにジャンプするには、次のようにします。- あなたの質問が他の人にも役立つように、より説明的なタイトルを使用してください。