シェルスクリプトを使用して、一意のファイル名形式と最新の作成日を持つ特定のPDFを選択しますか?

シェルスクリプトを使用して、一意のファイル名形式と最新の作成日を持つ特定のPDFを選択しますか?

スクリプトの助けが必要です。現在のファイル名の特定の要件を満たすPDFファイルを選択して別の場所に移動しようとしています。

私が選択したいファイル名の形式には、以下の例に示すように別々のセクションがあります。

I_XXX_PACK_6788669_6_9358869.pdf

私が望むのは、ファイル名の最後の部分(たとえば9358869)を持つファイルのみを選択し、ディレクトリ内の他のすべてのpdfファイルを無視することです。

Unixツール(POSIX find、sed、grepなど)を使用して実行できますか?私の主な問題は、ファイル名の6つの区切られた部分で構成される1つのファイルのみをインポートし、他のすべてのファイルは無視しようとしていることです。

  • そして、システム時間の1時間前に生成されたファイルだけを選択できますか?時間を確認するために、他のファイル形式ではsedを使用しましたが、pdfファイルでは使用しませんでした。だからこれが可能かどうかはわかりません。

ベストアンサー1

のようなファイルがあり、6つの区切られたセクションに一致するファイルのみがI_XXX_PACK_6788669_6_9358869.pdf必要です_9358869

これは、次に終わる(ゼロ文字以上のワイルドカード)で区切られた少なくとも6つの_部分と一致します。*_9358869.pdf

*_*_*_*_*_9358869.pdf

以下を使用して、過去1時間に変更されたが生成されなかったファイルを見つけることができますfind

find /path/to/directory -type f -mmin -60

POSIXを許可するには、適切な年齢を使用して-newer {file}設定する必要があります。{file}POSIXは、ファイルの変更日時を過去1時間に設定する安定した方法を提供していませんが、表示されているように私達はそれを使用できます:

printf -v curr '%(%s)T'
past=$(printf '%(%Y%m%d%H%M)T\n' "$((curr - 60*60))")
touch -t "$past" /path/to/timestamp

find /path/to/directory -type f -newer /path/to/timestamp

最後に、2つをマージします。

touch -t "$(printf -v curr '%(%s)T'; printf '%(%Y%m%d%H%M)T\n' "$((curr - 60*60))")" /path/to/timestamp
find /path/to/directory -type f -newer /path/to/timestamp -name '*_*_*_*_*_9358869.pdf'

おすすめ記事