Bashスクリプトを使用して選択したファイルの名前を変更する

Bashスクリプトを使用して選択したファイルの名前を変更する

次の形式の名前のファイルがたくさんあります。

Schedule_20210109-235901.jpg

つまり、スケジュール_日付-時間.jpg

ファイルの間隔は平均3秒で、bashスクリプトを作成し、より大きな時間で区切られたファイルを選択して名前を変更したいと思います。 forループとifステートメントを持つbashスクリプトが必要だと思いますが、以前はbashを実際に使用したことはありません。

コンテキストでは、過去2年間にウェブカメラの写真を保存していましたが、タイムラプスを作成したかったのです。しかし、3秒間隔では、私が撮影するスタジオではほとんど何も起こらないので、これは基本的に重複します。不要な写真を削除したり、多くのデータを移動したくありません。

私の考えは、30秒、1分、さらには1時間間隔でファイルの先頭に "use"を追加するbashスクリプトを作成することです。その後、ffmepgに渡されます。時々もう少し詳細な映像を作りたいとき、同じ技法を使って選ぶことができます。

正規表現やワイルドカードを使用してこれを行う方法がわかりません。

どんな点でも大変感謝します。

ベストアンサー1

「間隔」ロジックに基づいてファイルを選択し、新しいディレクトリにコピー(名前を変更しない)してから実行できますffmpeg。パラメータストリームを提供するffmpegことは、もともと思ったよりも優れています-i file。ハッキーに加えて、シェルコマンドの長さなど、いくつかの制限があります。

以下は、最初の写真から始めて、10枚の写真ごとに1つずつインポートする例です。順序はアルファベットの昇順であるため、ファイル名のタイムスタンプ基準です。

printf '%s\n' Schedule_* | awk 'NR%10==1' | xargs cp -t temp/ --

または、ゼロで区切られたGNU引数を使用してファイル名を要約します。

printf '%s\0' Schedule_* | awk 'NR%10==1' RS='\0' ORS='\0' | xargs -r0 cp -t temp/ --

選択する別の方法があります。タイムスタンプを分離できます。次の例をご覧ください。

printf '%s\n' Schedule_* | awk '{print substr($0,10,15)}'

返品20210109-235901など、さまざまな方法で多数のファイル名をフィルタリングできます。たとえば、1 時間に 1 つのイメージ (この時点で存在する場合は最初のイメージ) のみを取得するには、次のようにします。

printf '%s\n' Schedule_* | awk '!seen[substr($0,10,11)]++'

または1分間に1つの画像を取得します。

printf '%s\n' Schedule_* | awk '!seen[substr($0,10,13)]++'

ファイル選択の開始時刻と終了時刻を追加することもできます。たとえば、一定期間の各時間の最初の画像を取得します。

printf '%s\n' Schedule_* | awk '
  substr($0,10,15)>"202201" && substr($0,10,15)<"20220201-12" && !seen[substr($0,10,13)]++
'

すべての場合に引数をxargs- で連結して、cp後でffmpegグローブオプションを使用して一時ディレクトリとして実行できます。

おすすめ記事