Vraag Hoe kan ik de gewijzigde / gemaakte datum van een bestand wijzigen?


Is er een manier om de datum te wijzigen waarop een bestand is gewijzigd / gemaakt (wat wordt weergegeven in Nautilus of met de opdracht ls -l)? Idealiter ben ik op zoek naar een commando dat de datum / tijdstempels van een hele reeks bestanden kan veranderen naar een bepaalde hoeveelheid tijd vroeger of later (bijvoorbeeld +8 uur of -4 dagen etc.).


192
2017-09-22 05:32


oorsprong




antwoorden:


U kunt de modificatietijd van een bestand wijzigen met behulp van de touch opdracht:

touch filename

Standaard wordt hiermee de modificatietijd van het bestand ingesteld op de huidige tijd, maar er zijn een aantal vlaggen, zoals de -d vlag om een ​​bepaalde datum te kiezen. Als u bijvoorbeeld een bestand wilt instellen dat twee uur vóór heden wordt gewijzigd, kunt u het volgende gebruiken:

touch -d "2 hours ago" filename

Als u in plaats daarvan het bestand ten opzichte van de bestaande wijzigingstijd wilt wijzigen, moet het volgende het volgende doen:

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

Als u een groot aantal bestanden wilt wijzigen, kunt u het volgende gebruiken:

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

Je kunt de argumenten wijzigen in find om alleen de bestanden te selecteren waarin u geïnteresseerd bent. Als u alleen de modificatietijden van het bestand ten opzichte van de huidige tijd wilt bijwerken, kunt u dit vereenvoudigen tot:

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

Dit formulier is niet mogelijk met de relatieve bestandsversie, omdat het de shell gebruikt om de argumenten voor te vormen touch.

Wat de aanmaaktijd betreft, houden de meeste Linux-bestandssystemen deze waarde niet bij. Er is een ctime geassocieerd met bestanden, maar het houdt bij wanneer de bestandsmetadata voor het laatst is gewijzigd. Als het bestand nooit zijn rechten heeft gewijzigd, kan het gebeuren dat de aanmaaktijd behouden blijft, maar dit is een toeval. Het expliciet wijzigen van de tijd voor het wijzigen van bestanden telt als een metadata-wijziging, dus dit heeft ook de bijwerking van de update ctime.


259
2017-09-22 06:34



Om het eenvoudiger geval te vermelden wanneer alle bestanden zich in dezelfde map bevinden: touch -d "2 hours ago" /path/*.txt, bijvoorbeeld. - enzotib
Ik zou ook toevoegen dat het veranderen van de ctime is op geen enkele standaard manier mogelijk. - arrange
Is dit allemaal POSIX? - user1011471
De informatie over ctime omdat de tijd voor het wijzigen van metadata POSIX is. Ik weet niet of de shell-fragmenten in mijn antwoord zouden werken met strikte POSIX-shell-hulpprogramma's. Maar ze werken zeker op Ubuntu, wat de context is voor antwoorden op deze site. - James Henstridge
touch: illegal option -- d - User


Bedankt voor de hulp. Dit werkte voor mij:

Ga in de terminal naar de directory voor de datum-bewerking. Typ vervolgens:

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

Je zult een ">" zien nadat je op enter hebt gedrukt, behalve de laatste keer -> "done".

Notitie:  Mogelijk wilt u "201203101513" wijzigen

"201203101513" = is de gewenste datum voor alle bestanden in deze map.

Zie mijn webpagina


40
2018-03-10 14:21



het werkt niet zoals verwacht als een bestandsnaam lege spaties bevat - Angel


Eenvoudigste manier: toegang en wijziging zijn hetzelfde:

touch -a -m -t 201512180130.09 fileName.ext

Waar:

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

Als je wilt gebruiken NOW laat gewoon de -t en de tijdstempel.

Om te verifiëren dat ze allemaal hetzelfde zijn: stat fileName.ext

Zien: raak man aan


22
2017-12-19 14:58



Ik heb geprobeerd het te verifiëren met stat, maar geen van beide touch vlaggen leiden tot een correct resultaat. De wijzigingsdatum is aangepast, maar de datum is gewijzigd en is feitelijk gewijzigd in NU - Xerus


Touch kan zelfstandig verwijzen naar de datum van een bestand, niet nodig om te bellen date of gebruik opdrachtvervanging. Hier is een beetje van de infopagina van touch:

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

Bijvoorbeeld om 8 uur toe te voegen aan de datum van een bestand (bestandsnaam van file aangehaald in het geval van spaties, enz.):

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

Een lus gebruiken over alle bestanden in de huidige map:

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

Ik heb gehoord dat met behulp van een * en verhuren for kies de bestandsnamen zelf is veiliger, maar met find -print0 | xargs -0 touch ...  zou moeten behandelen meest gekke personages zoals nieuwe regels, spaties, aanhalingstekens, backslashes in een bestandsnaam. (PS. Probeer in de eerste plaats geen gekke personages in bestandsnamen te gebruiken).

Om bijvoorbeeld alle bestanden te vinden thatdirwaarvan de bestandsnamen beginnen met een s, en voeg een dag toe aan de aangepaste tijdstempel van dat bestand, gebruik:

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

6
2017-12-17 14:52





Dit kleine script werkt op zijn minst voor mij

#!/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
2017-08-06 19:40



Het aanpassen van de datum van afbeeldingen op basis van metagegevens in de afbeelding zou best nuttig zijn. ImageMagick's identificatie kan worden gebruikt. bijv. 'identify -verbose <image> | grep -i date', 'identify-formatat% [exif: DateTime] <image>' kan '2015: 01: 08 10:19:10' tonen (niet alle afbeeldingen hebben exif-gegevens) . Dit werkt (gebruik sed om de datum te converteren naar het formaat dat touch kan verwerken): 'touch -d $ (identify -format% [exif: DateTime] $ f | sed -r's /: / - /; s /: / - / ; ') $ f' - gaoithe


Het is lang geleden dat ik een soort Unix-programma heb geschreven, maar ik heb per ongeluk het jaar verkeerd ingesteld op een aantal kerstfoto's en ik wist dat als ik de datum van 2015 tot 2014 niet veranderde, dit later een probleem zou zijn .

Misschien is dit een gemakkelijke taak, maar ik heb geen eenvoudige manier gevonden om het te doen.

Ik heb een script aangepast dat ik hier heb gevonden en dat oorspronkelijk werd gebruikt om de datum met minus één maand aan te passen.

Hier is het originele script:

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

Dit is mijn aangepaste script dat de datum naar het jaar "2014" heeft gedwongen:

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

Ik realiseer me nu dat ik een meer generieke versie had kunnen doen:

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

Om dit bestand te gebruiken, moet u het schrijven en

chmod +x fn

uitvoeren:

./fn files-to-change

fn = your-file-naam-dat-is-your-commando

Voorbeeld

./fn *.JPG

wijzigt de datum minus één jaar in de map waar u zich bevindt.


1
2018-01-04 23:28



Hetzelfde als bovenstaande opmerking. De meeste .jpg-bestanden hebben een datum die is ingesloten in metadata die door de camera is toegevoegd. Dit werkt (gebruik sed om de datum te converteren naar het formaat dat touch kan verwerken): 'touch -d $ (identify -format% [exif: DateTime] $ f | sed -r's /: / - /; s /: / - / ; ') $ f' - gaoithe


wijzig gewoon de datum en tijd in de instellingen. sla vervolgens uw bestand op, het verandert automatisch


-6
2017-11-28 08:37



Snej is op zoek naar een batch- of opdrachtregeloplossing die kan worden gebruikt om meerdere bestanden aan te passen. Het wijzigen van de systeemtijd en datum en het wijzigen van de bestanden is waarschijnlijk geen ideale oplossing. - fabricator4
te veel triiiiiiicky !!! - Philippe Gachoud
Voor degenen met andere OS's die hier via internetzoekopdracht zijn binnengekomen, is dit antwoord de eenvoudigste manier om de datum van een bestand op Mac OSX te wijzigen ('touch -d' resulteert in 'illegale optie'). - alanning
@alanning: OSX heeft BSD touch, geen GNU touch. Gebruik -t. developer.apple.com/library/mac/documentation/Darwin/Reference/... - Dominik R
Dat kan onvoorziene gevolgen hebben. In een modern besturingssysteem worden steeds meer bestanden achter de schermen aangepast. Terwijl uw datum wordt gewijzigd, kunnen veel andere bestanden verkeerde datumstempels krijgen en kan alles gebeuren als iets anders in het systeem merkt dat een bestand ouder is dan verwacht. - Joe