複数のファイルの変更日(メタデータ)を変更するには?

複数のファイルの変更日(メタデータ)を変更するには?

いくつかの画像とビデオを含むギャラリーフォルダがあり、その一部は修正日が正確で、一部は月が間違っています。特定のフォルダ内のすべてのファイルを変更し、月を1月から6月(または他の同様の組み合わせ)に変更するスクリプトを作成したいと思います。例:

私の画像の日付は次のとおりです(名前ではなくEXIFメタデータ)。

05-Jan-2011
06-Jan-2011
07-Jan-2011

など...

年と日付を同じに保ち、すべての月を1月ではなく6月に変更したいと思います。

したがって、名前の代わりにEXIFメタデータになります。

05-Jun-2011
06-Jun-2011
07-Jun-2011

など....

どうすればいいですか?

よろしくお願いします。

答え1

更新:私の答えが間違っている場合はすぐにお知らせください。

file system's modification dateメタデータがメタデータと同じかどうかはわかりませんexitf modification date。テストしましたが、exiftool日付は同じであるため、それを使用してそのメタデータを操作できるようですtouch

解決策:

まず、次のコマンドを使用してファイルの変更日を取得する必要がありますstat

filedate=$(stat -c '%y' "/path/to/file" | cut -d' ' -f1)

今月は別の月に置き換えられます。これにはawkを使用できます。

newDate=$(awk -v month="Jun" -F '-' '{print $1"-"month"-"$3}' <<< $filedate )

次のコマンドを使用してtouch変更日を変更できます。

touch -m -d $newDate /path/to/file
#-m argument is used to change modification time
#-d is used to specify the new date

最後に、ファイルを再帰的に変更するには、findスクリプトファイル内の以前に提供されたコードを使用できます。

スクリプト.sh:

#! /usr/bin/env bash

filedate=$(stat -c '%y' "$1" | cut -d' ' -f1)

newMonth="Dec" #here you specify the month 
newDate=$(awk -v month=$newMonth -F '-' '{print $3"-"month"-"$1}' <<< $filedate )

touch -m -d $newDate $1

以下をfind使用できます。

find /path/to/your_directory -type f -exec ./script.sh {} \;

findコマンドで月を指定するには、それをscript.shに引数として渡します。

これでコードは次のようになります。

スクリプトファイル

#! /usr/bin/env bash

filedate=$(stat -c '%y' "$1" | cut -d' ' -f1)

newMonth="$2"
newDate=$(awk -v month=$newMonth -F '-' '{print $3"-"month"-"$1}' <<< $filedate )

touch -m -d $newDate $1

検索コマンド

find . -type f -exec ./script {} "Nov" \;

関連情報