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


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


192
2017-09-22 05:32


origem




Respostas:


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

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 -d bandeira 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 seu tempo de modificação existente, o seguinte deve fazer o seguinte:

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

Se você quiser modificar um grande número de arquivos, você 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 mudar os argumentos para find para selecionar apenas os arquivos nos quais você está interessado. Se você quiser apenas atualizar os tempos de modificação do arquivo em relação ao horário 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. Existe um ctime associado a 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.


260
2017-09-22 06:34



Para mencionar o caso mais simples quando todos os arquivos estão na mesma pasta: touch -d "2 hours ago" /path/*.txt, por exemplo. - enzotib
Eu também adicionaria que mudar o ctime não é possível de qualquer maneira padrão. - arrange
Isso é tudo POSIX? - user1011471
A informação sobre ctime como um tempo de alteração de metadados é de POSIX. Eu não sei se os fragmentos de shell na minha resposta funcionariam com os utilitários de shell POSIX estritos. Mas eles definitivamente funcionam no Ubuntu, que é o contexto para respostas neste site. - James Henstridge
touch: illegal option -- d - User


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 de apertar enter, exceto pela última vez -> "done".

Nota:  Você pode querer alterar "201203101513"

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

Veja minha página da web


40
2018-03-10 14:21



ele não funciona como esperado se um nome de arquivo contiver espaços em branco - Angel


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 NOW basta soltar o -t e o timestamp.

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

Vejo: toque homem


22
2017-12-19 14:58



Eu tentei verificar isso usando stat, mas nenhum dos touch sinalizadores levam a um resultado correto. A data de modificação é ajustada, mas a data de alteração e acesso é realmente alterada para NOW - Xerus


O toque pode referenciar a data de um arquivo sozinho, sem necessidade de ligar date ou use 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

Eu ouvi dizer que usar um * e deixando for escolher os nomes de arquivos em si é mais seguramas usando find -print0 | xargs -0 touch ...  deve lidar com a maioria 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 encontrar todos os arquivos em thatdircujos nomes de arquivo começam com um se adicione um dia ao registro de data e hora modificado desse arquivo, use:

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

6
2017-12-17 14:52





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

2
2017-08-06 19:40



Ajustar a data das imagens com base na meta informação na imagem seria bastante útil. A identificação do ImageMagick pode ser usada. por exemplo. 'identifique -verbose <image> | grep -i date', 'identifique -format% [exif: DateTime] <image>' pode mostrar '2015: 01: 08 10:19:10' (nem todas as imagens possuem dados exif) . Isso funciona (usando o sed para converter a data para o formato que o touch pode manipular): 'toque -d $ (identifique -format% [exif: DateTime] $ f | sed -r' s /: / - /; s /: / - / ; ') $ f' - gaoithe


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.

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 este arquivo, você precisaria escrevê-lo e

chmod +x fn

executar:

./fn files-to-change

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

Exemplo

./fn *.JPG

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


1
2018-01-04 23:28



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


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


-6
2017-11-28 08:37



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