ファイルが変更/作成された日付を変更する方法はありますか(Nautilusまたはls -lコマンドで表示されます)?理想的には、ファイル全体の日付/タイムスタンプを特定の時間より早いまたは遅い時間に変更できるコマンドを探しています(たとえば、+ 8時間または-4日など)。
ファイル(またはルート)の所有者である限り、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
を更新する副作用もあります。
助けてくれてありがとう。これは私のために働いた:
ターミナルで、日付編集用のディレクトリに移動します。次に入力します:
find -print | while read filename; do
# do whatever you want with the file
touch -t 201203101513 "$filename"
done
Enterキーを押した後、最後を除いて「>」が表示されます->「完了」。
注:「201203101513」を変更することもできます
"201203101513" =は、このディレクトリ内のすべてのファイルに必要な日付です。
最も簡単な方法-アクセスと変更は同じです:
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
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' '{}'
この小さなスクリプトは、少なくとも私のために動作します
#!/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プログラムを書いてから長い時間が経ちましたが、クリスマスの写真に誤って年を誤って設定してしまいました。 。
たぶん、これは簡単な作業ですが、簡単な方法は見つかりませんでした。
ここで見つけたスクリプトを変更しました。元々は、日付をマイナス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年だけ変更します。