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。これは正しくないようです。

次のエラーは、スクリプトがファイルの名前を変更しようとしたときに発生します。これは、ファイルを元のファイル名に戻そう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は安全ではありません。結果が台無しになります。ファイル名を安全にパイプするには、ゼロ区切り文字に慣れておく必要があります。
  • ファイル名にコロンが含まれている場合も同様に、cut間違った場所で分割されると思います。
  • -exec代わりに以下を使用しますxargs:find . -name '*.dat' -mtime -1 -exec file -i {} +
  • 失敗した場合はps2pdf、元のファイルを削除して続行します。たとえば、 ps2pdf ... || continue失敗時に次の反復にジャンプするには、次のように使用できます。
  • より説明的なタイトルを使用してください。そうすれば、あなたの質問が他の人にも役立つかもしれません。

関連情報