Hogyan módosíthatom a fájl módosított / létrehozott dátumát?

192

Van mód a fájl módosítása / létrehozása dátumának megváltoztatására (ami Nautilus vagy az ls -l paranccsal jelenik meg)? Ideális esetben olyan parancsot keresek, amely megváltoztathatja egy egész csomó fájl fájl dátumát / időjét egy bizonyos időre korábban vagy később (például +8 óra vagy -4 nap stb.).

    
készlet snej 22.09.2011 07:32
forrás

7 válasz

261

Megváltoztathatja a fájl módosításának idejét atouch paranccsal:

touch filename

Alapértelmezés szerint ez beállítja a fájl módosításának idejét az aktuális időhöz, de számos zászló van, például a-d flag, hogy kiválasszon egy adott dátumot. Így például, ha egy fájlt úgy állít be, hogy a jelenet előtt két órát módosított, akkor a következőket használhatja:

touch -d "2 hours ago" filename

Ha a meglévő módosítási időhöz képest módosítani szeretné a fájlt, a következőket kell tennie:

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

Ha nagyszámú fájlt szeretne módosítani, akkor a következőket használhatja:

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

Az argumentumokatfind -ra állíthatja be, hogy kiválassza csak az érdekelt fájlokat. Ha csak a jelenlegi időhöz képest frissíteni szeretné a fájl módosítását, egyszerűsítheti ezt:

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

Ez az űrlap nem lehetséges a fájl idő relatív verziójával, mert a shell-ot az argumentumokattouch -re állítja.

Ami a létrehozás idejét illeti, a legtöbb Linux fájlrendszer nem figyeli ezt az értéket. A (z)ctime fájlhoz társítva van, de a fájl metaadatainak legutóbbi módosításakor nyomon követi. Ha a fájl soha nem rendelkezik jogosultságokkal, előfordulhat, hogy megtartja a létrehozási időt, de ez egy véletlen. A fájlmódosítási idő explicit módon történő módosítása metaadatváltozásnak számít, ezért actime frissítésének mellékhatása is lehet.

    
válasz adott James Henstridge 22.09.2011 08:34
forrás
40

Köszönöm a segítséget. Ez nekem működött:

A terminálon menj a dátum szerkesztéshez. Ezután írja be:

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

Látni fogja a ">" a bevitelt követően utoljára - > "Done".

Megjegyzés:  Lehet, hogy módosítani szeretné a "201203101513"

beállítást

"201203101513" = a kívánt dátum a könyvtár összes fájljához.

Nézze meg weboldalam

    
válasz adott EFL 10.03.2012 15:21
forrás
22

A legegyszerűbb módja - a hozzáférés és a módosítás ugyanaz lesz:

touch -a -m -t 201512180130.09 fileName.ext

Hol:

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

HaNOW -ot szeretnél használni, csak dobd a-t -ot és az időbélyeget.

Annak ellenőrzésére, hogy mindegyik azonos: stat fileName.ext

Lásd: érintse meg az embert

    
válasz adott Jadeye 19.12.2015 15:58
forrás
6

Érintés lehet a fájl dátumát önmagában hivatkozni, nem kell felhívni adate parancsot vagy a parancs helyettesítését. Itt van egy kicsit a touch info oldalán:

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

Például, ha 8 órát kell hozzáadni egy fájl dátumához (file fájlnév csak szóközök esetén idézve):

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

Az aktuális könyvtár összes fájljához tartozó hurok használata:

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

Úgy hallottam, hogy a* használata és afor kiválasztása csak a fájlnevek kiválasztása biztonságosabb , de afind -print0 | xargs -0 touch ... használatával kezelnie kell leginkább új sorok, szóközök, idézőjelek, visszalépések egy fájlnévben. (PS. Próbálja meg, hogy ne használjon őrült karaktereket a fájlnevekben).

Például, ha megtalálja a (z)thatdir fájlban lévő összes fájlt, amelynek fájlneveks -al kezdődnek, és hozzáadni egy napot a fájl módosított időbélyegéhez, használja:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
    
válasz adott Xen2050 17.12.2016 15:52
forrás
2

Ez a kis script legalábbis nekem működik

#!/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
    
válasz adott joakim 06.08.2013 21:40
forrás
1

Régóta óta írtam bármilyen Unix programot, de véletlenül helytelenül helyeztem el egy évet a karácsonyi fotókon, és tudtam, hogy nem változtattam meg a dátumot 2015-ről 2014-re. probléma később.

Talán ez könnyű feladat, de nem találtam egyszerű módszert.

Módosítottam egy olyan szkriptet, amelyet itt találtam, amely eredetileg a dátumot mínusz egy hónappal módosították.

Itt van az eredeti szkript:

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

Itt van a módosított szkriptem, amely a dátumot 2014-es évre kényszerítette:

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

Most már tudom, hogy általánosabb verziót tehettem:

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

A fájl használatához írnia kell, és

chmod +x fn

végrehajtásához:

./fn files-to-change

fn = your-file-name-, hogy-is-a-parancs

Példa

./fn *.JPG

megváltoztatja a dátumot egy év múlva a könyvtárban, ahol Ön van.

    
válasz adott RickK 05.01.2015 00:28
forrás
-6

csak módosítsa a dátumot és az időt a beállításokban. majd mentse el a fájlt, automatikusan megváltozik

    
válasz adott vampiremac 28.11.2012 09:37
forrás