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

次のエラーは、スクリプトがファイルの名前を変更しようとしたときに発生します。これで、ファイルの名前を元のファイル名に戻したい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代わりに使用してくださいxargsfind . -name '*.dat' -mtime -1 -exec file -i {} +
  • ps2pdf失敗しても、引き続き元のファイルを削除できます。たとえば、ps2pdf ... || continue失敗したときに次の繰り返しにジャンプするには、次のようにします。
  • あなたの質問が他の人にも役立つように、より説明的なタイトルを使用してください。

おすすめ記事