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