正しい生成日を持つタイムスタンプのファイル名を変更する[閉じる]

正しい生成日を持つタイムスタンプのファイル名を変更する[閉じる]

creation time.

**shell script**今、すべてのフォルダを繰り返すことができるファイルを作成しようとしています。 >生成時間を抽出し、それをファイル名タイムスタンプに置き換えます。以下は小さな例です。

タイムスタンプが無効なソースファイル名:
ファイル名生産日、修正日
20180524010500530_FR785101.jpg

出力は次のとおりです。
ファイル名生産日、修正日
20180524000500530_FR785101.jpg

これがシェルスクリプトで達成できるかどうか教えてもらえますか?もしそうなら、このlsコマンドや他のコマンドを使用する方法を教えてくれる人はいますか?

コマンドを使用して直接記録を開始しましたが、ls生成時間を抽出してファイル名のタイムスタンプに置き換える方法はわかりません。イメージファイルを含むすべてのフォルダとサブフォルダに対してスクリプトを実行する方法もわかりません。 、

答え1

コマンドを使用してstatファイル作成時間を取得できます。

CREATION_TIME=`debugfs -R 'stat /path/to/file' /dev/sdaX | awk -F '-' '/crtime/{print $NF}'`

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

touch -d "$CREATION_TIME" file

答え2

以下は、あなたが提供したファイル名形式を厳密に使用してこれを行うスクリプトです。すべてのファイルが最初に日付/時刻で始まり、1時間の遅延だけを変更する必要があるとします。 epoch時間を使用してファイル名の時間から1時間を減算し、ファイル名を変更します。

スクリプトのディレクトリをローカルディレクトリに変更します。

ルーパー.sh

    #!/bin/bash

    echo "Sending directory to the past."

    for path in /path/to/directory/*.jpg; do
      filename=${path##*/}
      #Convert to date format
      oldDate="${filename:0:4}-${filename:4:2}-${filename:6:2} ${filename:8:2}:${filename:10:2}:${filename:12:2}"
      #Get the epoch date
      epochDate=$(date -d "$oldDate" +%s)
      #Subtract 1 hour
      epochDate=$(( $epochDate - 60*60 ))
      #Converting and formating the new date
      newDate=$(date -d @$epochDate +%Y%m%d%H%M%S)
      #New filename
      newFilename=$(dirname $path)/$newDate"${filename:14}"
      #Renaming the file
      mv $path $newFilename
    done

編集:名前を変更する前に生年月日を比較するスクリプトは次のとおりです。 (万が一に備えて必ずバックアップしてください)

#!/bin/bash

echo "Sending directory to the past."

for path in /path/to/directory/*.jpg; do
  filename=${path##*/}
  #Convert to date format
  oldDate="${filename:0:4}-${filename:4:2}-${filename:6:2} ${filename:8:2}:${filename:10:2}:${filename:12:2}"
  #Get the epoch date
  epochDate=$(date -d "$oldDate" +%s)
  #Birth date - Only works if your filesystem supports it.
  birthDate=$(stat $path | grep 'Birth:' | sed 's/\..*//' | awk '{print $2" "$3}')
  epochBirthDate=$(date -d "$birthDate" +%s)
  if [ $epochDate != $epochBirthDate ]; then
    #Subtract 1 hour
    epochDate=$(( $epochDate - 60*60 ))
    #Converting and formating the new date
    newDate=$(date -d @$epochDate +%Y%m%d%H%M%S)
    #New filename
    newFilename=$(dirname $path)/$newDate"${filename:14}"
    #Renaming the file
    mv $path $newFilename
  fi
done

関連情報