Como posso alterar a data de modificação / criação de um arquivo?

234

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 procurando um comando que possa alterar os carimbos de data / hora de um monte de arquivos para um determinado período de tempo, mais cedo ou mais tarde (por exemplo, +8 horas ou -4 dias etc.).

snej
fonte

Respostas:

324

Desde que você seja o proprietário do arquivo (ou raiz), você pode alterar a hora da modificação de um arquivo usando o touchcomando:

touch filename

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

touch -d "2 hours ago" filename

Se você deseja modificar o arquivo em relação ao tempo de modificação existente, faça o seguinte:

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

Se você deseja modificar um grande número de arquivos, pode 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 findselecionar apenas os arquivos nos quais você está interessado. Se você deseja atualizar apenas os tempos de modificação do arquivo em relação ao tempo atual, você pode simplificar isso para:

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

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

Quanto ao tempo de criação, a maioria dos sistemas de arquivos Linux não controla esse valor. Existe um ctimeassociado aos arquivos, mas rastreia quando os metadados do arquivo foram alterados pela última vez. Se o arquivo nunca tiver suas permissões alteradas, pode demorar o tempo de criação, mas isso é uma coincidência. Alterar explicitamente o tempo de modificação do arquivo conta como uma alteração de metadados, portanto também terá o efeito colateral de atualizar o arquivo ctime.

James Henstridge
fonte
Para mencionar o caso mais simples, quando todos os arquivos estão na mesma pasta: touch -d "2 hours ago" /path/*.txtpor exemplo.
enzotib 22/09/11
1
Eu também acrescentaria que ctimenão é possível alterar o padrão de nenhuma maneira.
organize
Isso é tudo POSIX?
user1011471
1
As informações sobre ctimecomo um horário de alteração de metadados são do POSIX. Não sei se os fragmentos de shell na minha resposta funcionariam com utilitários estritos de shell POSIX. Mas eles definitivamente funcionam no Ubuntu, que é o contexto para respostas neste site.
James Henstridge
1
No OSX, convém usar gtouchvia brew install coreutils.
Nobu 23/05
46

Obrigado pela ajuda. Isso funcionou para mim:

No terminal, vá para o diretório para editar a 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 de pressionar enter, exceto pela última vez -> "concluído".

Nota: convém alterar "201203101513"

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

Veja minha página

EFL
fonte
ele não funciona como esperado se o nome do arquivo contém espaços em branco
anjo
Página da web não é mais, embora seja seis anos depois. No entanto, esta é a resposta que eu estava procurando. Para aqueles que desejam incluir segundos em seu tempo, use .ssonde ss é o número de segundos. (Nota: isso parece não controlar tempos de sub-segundo, como nanossegundos ou milissegundos, que para mim pareciam zeros; no entanto, essa diferença era permitida para o meu caso de uso.)
Spencer D
34

A maneira mais fácil - acessada e modificada será a mesma:

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, NOWbasta soltar o -te o carimbo de data e hora.

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

Veja: touch man

Jadeye
fonte
1
Tentei verificá-lo usando stat, mas nenhum dos touchsinalizadores levou a um resultado correto. A data de modificação é ajustada, mas a data alterada e acessada é realmente alterada para NOW
Xerus
Não funcionou para mim, mudou apenas o tempo de "Mudança"
Revious
@Revious, Xerus Qual é a diferença entre a changedhora e os modifiedcarimbos de data e hora?
ijoseph
9

O Touch pode fazer referência à data de um arquivo por si só, sem necessidade de chamar dateou usar a substituição de comandos. 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 filecitado 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 forescolher os nomes de arquivos em si é mais seguro , mas o uso find -print0 | xargs -0 touch ... deve lidar com a maioria dos caracteres malucos, como novas linhas, espaços, aspas, barras invertidas em um nome de arquivo. (PS. Tente não usar caracteres malucos nos nomes de arquivos em primeiro lugar).

Por exemplo, para localizar todos os arquivos thatdircujos nomes de arquivo começam com um se adicionar um dia ao carimbo de data / hora modificado, use:

find thatdir -name "s*" -print0 | xargs -0 -I '{}' touch -r '{}' -d '+1 day' '{}'
Xen2050
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
joakim
fonte
2
Ajustar a data das imagens com base nas meta informações da imagem seria bastante útil. A identificação do ImageMagick pode ser usada. por exemplo, 'identifique -verbose <image> | grep -i data', 'identifique-formato% [exif: DateTime] <image>' pode mostrar '2015: 01: 08 10:19:10' (nem todas as imagens têm dados exif ) Isso funciona (usando sed para converter a data em formato que o toque pode manipular): 'touch -d $ (identifique-formato% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe
1

Faz muito tempo desde que escrevi qualquer tipo de programa Unix, mas acidentalmente defini o ano incorretamente em várias fotos de Natal, e eu sabia que se 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.

Modifiquei um script que encontrei aqui, que originalmente era usado para modificar a data em menos de um mês.

Aqui está 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

Aqui está 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 esse arquivo, você precisará escrevê-lo e

chmod +x fn

executar:

./fn files-to-change

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

Exemplo

./fn *.JPG

alterará a data em menos de um ano no diretório em que você está.

RickK
fonte
1
O mesmo que o comentário acima. A maioria dos arquivos .jpg terá a data incorporada nos metadados adicionados pela câmera. Isso funciona (usando sed para converter a data em formato que o touch pode manipular): 'touch -d $ (identifique-formato% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f'
gaoithe
-6

basta alterar a data e a hora nas configurações. salve seu arquivo, ele muda automaticamente

vampiremac
fonte
3
Snej está procurando uma solução em lote ou em linha de comando que possa ser usada para modificar vários arquivos. Alterar a hora e data do sistema e modificar os arquivos provavelmente não é a solução ideal.
fabricator4
muito triiiiiiicky !!!
Philippe Gachoud
Para aqueles com outros sistemas operacionais trazidos para cá por meio da pesquisa na web, esta resposta é a maneira mais simples de alterar a data de um arquivo no Mac OSX ('touch-d' resulta em 'opção ilegal').
alanning
1
@alanning: OSX tem toque BSD, não toque GNU. Use -t. developer.apple.com/library/mac/documentation/Darwin/Reference/...
Dominik R
Isso pode ter consequências imprevistas. Em um sistema operacional moderno, muitos arquivos são modificados nos bastidores o tempo todo. Enquanto sua data é alterada, muitos outros arquivos podem ter carimbos de data errados e qualquer coisa pode acontecer quando outra coisa no sistema percebe que um arquivo é mais antigo que o esperado.
Joe