Jak mohu změnit datum změny / vytvoření souboru?

192

Existuje způsob, jak změnit datum, kdy byl soubor změněn / vytvořen (který je zobrazen v programu Nautilus nebo pomocí příkazu ls-l)? V ideálním případě hledám příkaz, který může změnit časové a časové razítka celé skupiny souborů na určité časové období dříve nebo později (např. +8 hodin nebo -4 dní apod.).

    
dané snej 22.09.2011 07:32

7 odpovědí

261

Můžete změnit dobu modifikace souboru pomocí příkazutouch:

touch filename

Ve výchozím nastavení se nastaví doba modifikace souboru na aktuální čas, ale existuje několik příznaků, jako je příznak-d pro výběr konkrétního data. Chcete-li například soubor nastavit jako upravený dvě hodiny před přítomností, můžete použít následující:

touch -d "2 hours ago" filename

Pokud chcete změnit soubor namísto jeho stávajícího modifikačního času, měli byste udělat tento trik:

touch -d "$(date -R -r filename) - 2 hours" filename

Pokud chcete upravit velký počet souborů, můžete použít následující:

find DIRECTORY -print | while read filename; do
    # do whatever you want with the file
    touch -d "$(date -R -r "$filename") - 2 hours" "$filename"
done

Můžete změnit argumenty nafind a vybrat pouze soubory, které vás zajímají. Chcete-li pouze aktualizovat časy úprav souborů vzhledem k současné době, můžete to zjednodušit:

find DIRECTORY -exec touch -d "2 hours ago" {} +

Tento formulář není možné s relativní verzí souboru, protože používá shell pro vytvoření argumentů protouch.

Pokud jde o dobu tvorby, většina souborových systémů Linux nedrží tuto hodnotu. K souborům je přiřazenoctime, ale sleduje, kdy byly naposledy změněny metadata souboru. Pokud soubor nikdy nemá změněné oprávnění, může dojít k vytvoření doby vytvoření, ale je to náhoda. Výslovně změna doby modifikace souborů se počítá jako změna metadat, takže bude mít i vedlejší efekt aktualizacectime.

    
odpověděl James Henstridge 22.09.2011 08:34
40

Děkujeme za pomoc. Toto fungovalo pro mě:

V terminálu přejděte do adresáře pro úpravu data. Potom zadejte:

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

Uvidíte ">" po stisknutí klávesy Enter, exept naposledy - > "hotovo".

Poznámka:  Možná budete chtít změnit "201203101513"

"201203101513" = je datum, které chcete pro všechny soubory v tomto adresáři.

Podívejte se na mou webovou stránku

    
odpověděl EFL 10.03.2012 15:21
22

Nejjednodušší způsob - přístup a úprava budou stejné:

touch -a -m -t 201512180130.09 fileName.ext

Kde:

-a = accessed
-m = modified
-t = timestamp - use [[CC]YY]MMDDhhmm[.ss] time format

Chcete-li použítNOW, stačí uvést-t a časové razítko.

Ověřte, zda jsou stejné: stat fileName.ext

Viz: dotýkat se člověka

    
odpověděl Jadeye 19.12.2015 15:58
6

Dotykem můžete odkazovat na datum souboru sám o sobě, není třeba volatdate nebo použít náhradu příkazu. Tady je trochu na info stránce dotyku:

'-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.

Například přidání 8 hodin k datu souboru (jméno souborufile citováno jen v případě mezer atd.):

touch -r "file" -d '+8 hour' "file"

Použití smyčky ve všech souborech v aktuálním adresáři:

for i in *; do touch -r "$i" -d '+8 hour' "$i"; done

Slyšel jsem, že pomocí* a nechánímfor vybrat jména souborů je bezpečnější , ale pomocífind -print0 | xargs -0 touch ... by se měly zpracovávat většina nové řádky, mezery, citace, zpětná lomítka v názvu souboru. (PS, zkuste nejdříve používat jména v jménech).

Chcete-li například najít všechny soubory vthatdir jejichž názvy souborů začínají ss a přidat jeden den do upravené časové značky, použijte:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
    
odpověděl Xen2050 17.12.2016 15:52
2

Tento malý skript přinejmenším pracuje pro mě

#!/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
    
odpověděl joakim 06.08.2013 21:40
1

Od psaní jakéhokoli druhu programu Unix jsem byl dlouhou dobu, ale omylem jsem nesprávně nastavil rok na spoustu vánočních fotek a věděl jsem, že kdybych nezměnil datum od roku 2015 do roku 2014, bylo by to problém později.

Možná je to snadný úkol, ale nenašel jsem žádný jednoduchý způsob, jak to udělat.

Upravil jsem zde skript, který jsem původně použil k úpravě data o měsíc mínus.

Zde je původní skript:

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

Zde je modifikovaný skript, který vynutil datum do roku 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

Teď si uvědomuji, že jsem mohl udělat více obecnou verzi:

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

Chcete-li tento soubor použít, musíte jej napsat a

chmod +x fn

provést:

./fn files-to-change

fn = Váš soubor-název-ten-je-váš-příkaz

Příklad

./fn *.JPG

změní datum o mínus jeden rok v adresáři, ve kterém jste.

    
odpověděl RickK 05.01.2015 00:28
-6

změňte datum a čas v nastavení. pak soubor uložíte, automaticky se změní

    
odpověděl vampiremac 28.11.2012 09:37