web-dev-qa-db-ja.com

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

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

230
snej

ファイル(またはルート)の所有者である限り、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を更新する副作用もあります。

315

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

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

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

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

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

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

私のウェブページを参照

45
EFL

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

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 man

33
Jadeye

Touchはファイルの日付をすべて単独で参照でき、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にファイル名自体を選択させることは安全ですが、find -print0 | xargs -0 touch ...を使用するとmostファイル名の改行、スペース、引用符、バックスラッシュなどの狂気の文字。 (PS。そもそもファイル名にクレイジーな文字を使用しないようにしてください)。

たとえば、ファイル名がthatdirで始まるs内のすべてのファイルを検索し、それらのファイルの変更されたタイムスタンプに1日を追加するには、次を使用します。

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
9
Xen2050

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

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

あらゆる種類のUnixプログラムを書いてから長い時間が経ちましたが、クリスマスの写真に誤って年を誤って設定してしまいました。 。

たぶん、これは簡単な作業ですが、簡単な方法は見つかりませんでした。

ここで見つけたスクリプトを変更しました。元々は、日付をマイナス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
RickK