Como posso alterar a data modificada / criada de um arquivo?

197

Existe uma maneira de alterar a data em que um arquivo foi modificado / criado (que é mostrado no Nautilus ou com o comando ls -l)? Idealmente, estou à procura de um comando que possa alterar os carimbos de data / hora de um conjunto de arquivos para um determinado período de tempo, mais cedo ou mais tarde (por exemplo, +8 horas ou -4 dias, etc.).

    
por snej 22.09.2011 / 07:32
fonte

7 respostas

265

Você pode alterar o tempo de modificação de um arquivo usando o comando touch :

touch filename

Por padrão, isso definirá a hora de modificação do arquivo como a hora atual, mas há vários sinalizadores, como o sinalizador -d para escolher uma data específica. Por exemplo, para definir um arquivo como modificado duas horas antes do presente, você poderia usar o seguinte:

touch -d "2 hours ago" filename

Se você quiser modificar o arquivo em relação ao tempo de modificação existente, o seguinte deve ser feito:

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

Se você quiser modificar um grande número de arquivos, poderá usar o seguinte:

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

Você pode alterar os argumentos para find para selecionar apenas os arquivos nos quais está interessado. Se desejar apenas atualizar os horários de modificação do arquivo em relação ao momento atual, você pode simplificá-lo para:

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

Este formulário não é possível com a versão relativa ao tempo de arquivo porque ele usa o shell para formar os argumentos para touch .

No que diz respeito ao tempo de criação, a maioria dos sistemas de arquivos Linux não rastreia esse valor. Há um ctime associado aos arquivos, mas rastreia quando os metadados do arquivo foram alterados pela última vez. Se o arquivo nunca tiver suas permissões alteradas, pode acontecer de manter o tempo de criação, mas isso é uma coincidência. A alteração explícita do tempo de modificação do arquivo conta como uma alteração de metadados, portanto, também terá o efeito colateral de atualizar o ctime .

    
por James Henstridge 22.09.2011 / 08:34
fonte
40

Obrigado pela ajuda. Isso funcionou para mim:

No terminal, vá para o diretório para edição de data. Então digite:

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

Você verá um ">" depois que você aperte enter, exceto pela última vez - > "feito".

Nota:  Você pode querer mudar "201203101513"

"201203101513" = é a data que você deseja para todos os arquivos neste diretório.

Veja meu site

    
por EFL 10.03.2012 / 15:21
fonte
22

O caminho mais fácil - acessado e modificado será o mesmo:

touch -a -m -t 201512180130.09 fileName.ext

Onde:

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

Se você deseja usar NOW , apenas elimine o -t e o timestamp.

Para verificar se são todos iguais: stat fileName.ext

Veja: touch man

    
por Jadeye 19.12.2015 / 15:58
fonte
7

O Touch pode referenciar a data de um arquivo sozinho, não é necessário chamar date ou usar a substituição de comando. Aqui está um pouco da página de informações do toque:

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

Por exemplo, para adicionar 8 horas à data de um arquivo (nome do arquivo de file citado apenas no caso de espaços, etc):

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

Usando um loop sobre todos os arquivos no diretório atual:

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

Ouvi dizer que usar um * e deixar for escolher os próprios nomes de arquivo é mais seguro , mas usar find -print0 | xargs -0 touch ... deve manipular mais caracteres malucos como novas linhas, espaços, citações, barras invertidas em um nome de arquivo. (PS. Tente não usar caracteres malucos em nomes de arquivos em primeiro lugar).

Por exemplo, para localizar todos os arquivos em thatdir cujos nomes de arquivos começam com s e adicionar um dia ao registro de data e hora modificado desses arquivos, use:

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

Este pequeno script, pelo menos, funciona para mim

#!/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
    
por joakim 06.08.2013 / 21:40
fonte
1

Já faz muito tempo desde que eu escrevi qualquer tipo de programa Unix, mas eu acidentalmente ajustei o ano incorretamente em um monte de fotos de Natal, e eu sabia que se eu não mudasse a data de 2015 para 2014, seria um problema mais tarde.

Talvez seja uma tarefa fácil, mas não encontrei nenhuma maneira simples de fazer isso.

Eu modifiquei um script que encontrei aqui, que originalmente foi usado para modificar a data por menos um mês.

Este é o script original:

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

Este é o meu script modificado que forçou a data para o ano "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

Agora percebo que poderia ter feito uma versão mais genérica:

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

Para usar este arquivo, você precisaria escrevê-lo e

chmod +x fn

para executar:

./fn files-to-change

fn = nome-do-arquivo-que-é-seu-comando

Exemplo

./fn *.JPG

mudará a data menos um ano no diretório onde você está.

    
por RickK 05.01.2015 / 00:28
fonte
-6

apenas altere a data e a hora nas configurações. depois salve seu arquivo, ele muda automaticamente

    
por vampiremac 28.11.2012 / 09:37
fonte