回答:
ファイル(またはルート)の所有者であれば、touch
次のコマンドを使用してファイルの変更時間を変更できます。
touch filename
デフォルトでは、これはファイルの変更時間を現在の時間に設定しますが-d
、特定の日付を選択するフラグなど、いくつかのフラグがあります。したがって、たとえば、現在の2時間前にファイルが変更されるように設定するには、次を使用できます。
touch -d "2 hours ago" filename
代わりに、既存の変更時間に関連してファイルを変更する場合は、次の手順を実行する必要があります。
touch -d "$(date -R -r filename) - 2 hours" filename
多数のファイルを変更する場合は、次を使用できます。
find DIRECTORY -print | while read filename; do
# do whatever you want with the file
touch -d "$(date -R -r "$filename") - 2 hours" "$filename"
done
引数を変更して、find
関心のあるファイルのみを選択することができます。現在の時刻に対するファイル変更時刻のみを更新する場合は、これを次のように単純化できます。
find DIRECTORY -exec touch -d "2 hours ago" {} +
この形式は、シェルを使用しての引数を作成するため、ファイル時間相対バージョンでは使用できませんtouch
。
作成時間が経過する限り、ほとんどのLinuxファイルシステムはこの値を追跡しません。あるctime
ファイルに関連付けられているが、ファイルのメタデータが最後に変更されたとき、それが追跡します。ファイルのパーミッションが変更されない場合、作成時間が保持されることがありますが、これは偶然です。ファイルの変更時間を明示的に変更すると、メタデータの変更としてカウントされるため、を更新するという副作用もありctime
ます。
ctime
、標準の方法では変更を行うことはできません。
ctime
メタデータの変更時間に関する情報はPOSIXからのものです。答えのシェルフラグメントが厳密なPOSIXシェルユーティリティで機能するかどうかはわかりません。しかし、彼らは間違いなくUbuntuで動作します。これはこのサイトの回答のコンテキストです。
gtouch
経由で使用できますbrew install coreutils
。
助けてくれてありがとう。これは私のために働いた:
ターミナルで、日付編集用のディレクトリに移動します。次に入力します:
find -print | while read filename; do
# do whatever you want with the file
touch -t 201203101513 "$filename"
done
Enterキーを押した後、最後を除いて「>」が表示されます->「完了」。
注:「201203101513」を変更することもできます
"201203101513" =は、このディレクトリ内のすべてのファイルに必要な日付です。
.ss
、ssが秒数である場所を使用します。(注:これはナノ秒やミリ秒などの1秒未満のタイミングを制御していないようで、私にとってはゼロとして表示されますが、この違いは私のユースケースでは許容されていました。)
最も簡単な方法-アクセスと変更は同じです:
touch -a -m -t 201512180130.09 fileName.ext
どこ:
-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format
使用する場合は、タイムスタンプをNOW
ドロップし-t
ます。
それらがすべて同じであることを確認するには:
stat fileName.ext
参照:タッチマン
touch
フラグも正しい結果になりません。変更日は調整されますが、変更日およびアクセス日は実際にはNOWに変更されます
changed
時間とmodified
タイムスタンプの違いは何ですか?
タッチはファイルの日付をすべて単独で参照でき、date
コマンド置換を呼び出したり使用したりする必要はありません。タッチの情報ページの一部を次に示します。
`-r FILE' `--reference=FILE'
Use the times of the reference FILE instead of the current time.
If this option is combined with the `--date=TIME' (`-d TIME')
option, the reference FILE's time is the origin for any relative
TIMEs given, but is otherwise ignored. For example, `-r foo -d
'-5 seconds'' specifies a time stamp equal to five seconds before
the corresponding time stamp for `foo'. If FILE is a symbolic
link, the reference timestamp is taken from the target of the
symlink, unless `-h' was also in effect.
たとえば、ファイルの日付に8時間を追加するには(file
スペースなどの場合に引用されるファイル名など):
touch -r "file" -d '+8 hour' "file"
現在のディレクトリ内のすべてのファイルでループを使用する:
for i in *; do touch -r "$i" -d '+8 hour' "$i"; done
を使用してファイル名自体を選択する方が安全である*
と聞きましたが、使用するとfor
ファイル名の改行、スペース、引用符、バックスラッシュなどのほとんどのクレイジーな文字 を処理するはずです。(PS。そもそもファイル名にクレイジーな文字を使用しないようにしてください)。find -print0 | xargs -0 touch ...
たとえばthatdir
、ファイル名がで始まるすべてのファイルを検索し、s
それらのファイルの変更されたタイムスタンプに1日を追加するには、次を使用します。
find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
この小さなスクリプトは、少なくとも私のために動作します
#!/bin/bash
# find specific files
files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in ${files}
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch
touch -t $(date -v -1m -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
done
あらゆる種類のUnixプログラムを書いてから長い時間が経ちましたが、クリスマスの写真に誤って年を誤って設定してしまい、2015年から2014年に日付を変更しなければ問題になることがわかりました。 。
たぶん、これは簡単な作業ですが、簡単な方法は見つかりませんでした。
ここで見つけたスクリプトを変更しました。元々は、日付をマイナス1か月変更するために使用されていました。
元のスクリプトは次のとおりです。
#!/bin/bash
# find specific files
files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in ${files}
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch
touch -t $(date -v -1m -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
done
これは、日付を「2014」年に強制する修正したスクリプトです。
#!/bin/bash
# find specific files
#files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in $*
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch
touch -t $(date -v +1y -r $(stat -f %m "${f}") +2014%m%d%H%M.%S) "${f}"
done
私は今、私はもっと一般的なバージョンを行うことができたことに気付きました:
#!/bin/bash
# find specific files
#files=$(find . -type f -name '*.JPG')
# use newline as file separator (handle spaces in filenames)
IFS=$'\n'
for f in $*
do
# read file modification date using stat as seconds
# adjust date backwards (1 month) using date and print in correct format
# change file time using touch (+1y adds a year "-1y" subtracts a year)
# Below line subtracts a year
touch -t $(date -v -1y -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
# Below line adds a year
# touch -t $(date -v +1y -r $(stat -f %m "${f}") +%Y%m%d%H%M.%S) "${f}"
done
このファイルを使用するには、ファイルを作成し、
chmod +x fn
実行する:
./fn files-to-change
fn =あなたのファイル名であるコマンド
例
./fn *.JPG
あなたがいるディレクトリの日付をマイナス1年だけ変更します。
設定で日付と時刻を変更するだけです。ファイルを保存すると、自動的に変更されます
touch -d "2 hours ago" /path/*.txt
たとえば、すべてのファイルが同じフォルダー内にある場合の簡単な例を挙げます:。