スクリプトの助けが必要です。現在のファイル名の特定の要件を満たす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'