Script para alterar o tempo de modificação de arquivos e diretórios de forma recursiva

4

Eu tenho muitas pastas grandes com milhares de arquivos nelas e quero usar touch para definir os tempos de modificação como "hora original" +3 horas.

Eu recebi este script de um segmento semelhante no superusuário:

#!/bin/sh
for i in all/*; do
  touch -r "$i" -d '+3 hour' "$i"
done

então eu estou supondo que eu preciso fazer funcionar em qualquer diretório ao invés de um fixo (então eu não precisarei editar o script toda vez que eu quiser rodá-lo em algum lugar diferente) e para ele poder encontrar e editar arquivos recursivamente.

Eu tenho pouca experiência usando Linux e esta é a primeira vez que eu configuro um script bash, embora eu saiba uma coisa ou duas sobre programação (principalmente em C).

muito obrigado a todos pela ajuda:)

    
por Achus 18.06.2015 / 01:36

2 respostas

6

Use find -exec para touch recursiva, com argumentos de linha de comando para o dirs processar.

#!/bin/sh
for i in "$@"; do
    find "$i" -type f -exec touch -r {} -d '+3 hour' {} \;
done

Você pode executá-lo assim:

./script.sh /path/to/dir1 /path/to/dir2
    
por 18.06.2015 / 04:03
2

A resposta correta e completa é:

Para modificar o tempo de acesso apenas com o comando " touch ", você deve usar o parâmetro " -a ", caso contrário o comando modificará o tempo de modificação também. Por exemplo, para adicionar 3 horas:

touch -a -r test_file -d '+3 hour' test_file

From man touch:

Update the access and modification times of each FILE to the current time.

-a                     change only the access time

-r, --reference=FILE   use this files times instead of current time.

-d, --date=STRING      parse STRING and use it instead of current time

Assim, o arquivo terá tempo de acesso igual ao tempo de acesso antigo mais 3 horas. E o tempo de modificação permanecerá o mesmo. Você pode verificar isso com:

stat test_file

Finalmente, para modificar o tempo de acesso apenas para um diretório inteiro e seus arquivos e subdiretórios, você pode usar o comando " find " para percorrer o diretório e usar " -exec "parâmetro para executar" toque "em cada arquivo e diretório (apenas não filtre a pesquisa com o argumento" - tipo f ", isso não afetará os diretórios) .

find dir_test -exec touch -a -r '{}' -d '+3 hours' '{}' \;

From man find:

-type c     File is of type c:

            d      directory

            f      regular file

and for -exec:

-exec command ;
          Execute command; true if 0 status is returned.  All following arguments to find are taken to be arguments to the command until an argument consisting  of  ';'  is  encoun-
          tered.  The string '{}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone,
          as in some versions of find.  Both of these constructions might need to be escaped (with a '\') or quoted to protect them from expansion by the shell.   See  the  EXAMPLES
          section  for examples of the use of the -exec option.  The specified command is run once for each matched file.  The command is executed in the starting directory.   There
          are unavoidable security problems surrounding use of the -exec action; you should use the -execdir option instead.

Just remember enclose the braces in single quote marks to protect them from interpretation as shell script punctuation. The semicolon is similarly protected by the use of a backslash, though single quotes could have been used in that case also.

Finalmente, para usá-lo em um script de shell como "yaegashi" disse:

#!/bin/sh
for i in "$@"; do
    find "$i" -exec touch -a -r '{}' -d '+3 hours' '{}' \;
done

E corra como "yaegashi", disse:

./script.sh /path/to/dir1 /path/to/dir2

Ele pesquisará todos os diretórios dentro de dir1 e dir2 e alterará apenas o tempo de acesso para todos os arquivos e subdiretórios.

    
por 28.06.2015 / 20:40