ファイルの変更/作成日を変更するにはどうすればよいですか?


234

ファイルが変更/作成された日付を変更する方法はありますか(Nautilusまたはls -lコマンドで表示されます)?理想的には、ファイルの全体の日付/タイムスタンプを特定の時間(たとえば、+ 8時間または-4日など)に変更できるコマンドを探しています。

回答:


324

ファイル(またはルート)の所有者であれば、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ます。


touch -d "2 hours ago" /path/*.txtたとえば、すべてのファイルが同じフォルダー内にある場合の簡単な例を挙げます:。
エンゾチブ

1
またctime、標準の方法では変更を行うことはできません。
手配

これはすべてPOSIXですか?
user1011471

1
ctimeメタデータの変更時間に関する情報はPOSIXからのものです。答えのシェルフラグメントが厳密なPOSIXシェルユーティリティで機能するかどうかはわかりません。しかし、彼らは間違いなくUbuntuで動作します。これはこのサイトの回答のコンテキストです。
ジェームズヘンストリッジ

1
OSXでは、gtouch経由で使用できますbrew install coreutils
ノブ

46

助けてくれてありがとう。これは私のために働いた:

ターミナルで、日付編集用のディレクトリに移動します。次に入力します:

find -print | while read filename; do
    # do whatever you want with the file
    touch -t 201203101513 "$filename"
done

Enterキーを押した後、最後を除いて「>」が表示されます->「完了」。

注:「201203101513」を変更することもできます

"201203101513" =は、このディレクトリ内のすべてのファイルに必要な日付です。

私のウェブページを見る


ファイル名に空白スペースが含まれる場合、期待どおりに動作しません
エンジェル

6年後ですが、Webページはもうありません。それにもかかわらず、これは私が探していた答えです。時間に秒を含める場合は.ssssが秒数である場所を使用します。(注:これはナノ秒やミリ秒などの1秒未満のタイミングを制御していないようで、私にとってはゼロとして表示されますが、この違いは私のユースケースでは許容されていました。)
スペンサーD

34

最も簡単な方法-アクセスと変更は同じです:

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

参照:タッチマン


1
statを使用して検証しようとしましたが、どちらのtouchフラグも正しい結果になりません。変更日は調整されますが、変更日およびアクセス日は実際にはNOWに変更されます
Xerus

それは私にとっては
うまくいき

@Revious、Xerus changed時間とmodifiedタイムスタンプの違いは何ですか?
ijoseph

9

タッチはファイルの日付をすべて単独で参照でき、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' '{}'

2

この小さなスクリプトは、少なくとも私のために動作します

#!/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

2
画像のメタ情報に基づいて画像の日付を調整すると非常に便利です。ImageMagickの識別を使用できます。たとえば、「identify -verbose <image> | grep -i date」、「identify -format%[exif:DateTime] <image>」は「2015:01:08 10:19:10」と表示される場合があります(すべての画像にexifデータがあるわけではありません) )。これは機能します(sedを使用して日付をtouchが処理できる形式に変換します): 'touch -d $(identify -format%[exif:DateTime] $ f | sed -r' s /:/-/; s /:/-/ ; ')$ f'
gaoithe

1

あらゆる種類の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年だけ変更します。


1
上記のコメントと同じ。ほとんどの.jpgファイルには、カメラによってメタデータに埋め込まれた日付が埋め込まれます。これは機能します(sedを使用して日付をタッチが処理できる形式に変換します): 'touch -d $(identify -format%[exif:DateTime] $ f | sed -r' s /:/-/; s /:/-/ ; ')$ f'
gaoithe

-6

設定で日付と時刻を変更するだけです。ファイルを保存すると、自動的に変更されます


3
Snejは、複数のファイルを変更するために使用できるバッチまたはコマンドラインソリューションを探しています。システムの日時を変更してファイルを変更することは、おそらく理想的な解決策ではありません。
fabricator4

あまりにも多くのtriiiiiiicky!
フィリップガチュー

Web検索で他のOSを使用している場合、この答えはMac OSXでファイルの日付を変更する最も簡単な方法です(「touch -d」は「不正なオプション」になります)。
アランニング14

1
@alanning:OSXにはBSDタッチがあり、GNUタッチはありません。-tを使用します。developer.apple.com/library/mac/documentation/Darwin/Reference/...
ドミニクR

それは予期せぬ結果をもたらす可能性があります。最新のOSでは、多くのファイルがバックグラウンドで常に変更されています。日付が変更されている間、他の多くのファイルは誤った日付スタンプを取得する可能性があり、システム内の何かがファイルが予想よりも古いことに気づいたときに何かが起こる可能性があります。
ジョー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.