Linux encontra o arquivo na pasta e move-o para o novo local com o prefixo de tempo

0

Eu tenho uma pasta de backup que é acessível com o sftp. A idéia é que o backup vem para esta pasta, mas não deve ficar lá. Eu quero movê-los com um cron job. Isso já é possível, mas como não posso ter certeza de que um nome de arquivo é único, gostaria de prefixar o arquivo ao movê-lo.

* * * * * find /src/backup/ -mmin +60 -exec mv "{}" /dest/backup/ \;

Como posso modificar o comando de forma que o próprio arquivo receba um prefixo? por exemplo. yyyymmdd-MMSS- ou que uma nova pasta é usada, por exemplo yyyymmdd ?

    
por Webdesigner 31.10.2017 / 11:47

2 respostas

0

Então, porque eu preciso de alguma flexibilidade, de qualquer forma, eu criei uma versão de script baseada na ideia da AFH.

#!/bin/sh

# configure: source path
source_path="/src/path/backup";

# configure: destination path
destination_path="/dest/path/backup";

# find all files in source_path not modified in the last 60 minutes
find $source_path -mmin +60 -type f | while read -r file; do

    # this is the absolute source path (/src/path/backup/path/to/file)
    absolute_source_path="${file%/*}";

    # get the relative source path (/path/to/file)
    relative_source_path=${absolute_source_path#$source_path}

    # get the last modification date of the file (yyyymmdd)
    file_save_date="$(date -d@$(stat "$file" -c %Y) +'%Y%m%d')";

    # IMPORTANT create sub directory at the destination if required
    mkdir --parents "$destination_path/$file_save_date$relative_source_path/";

    # move the file to new destination (/dest/path/backup/yyyymmdd/path/to/file)
    mv "$file" "$destination_path/$file_save_date$relative_source_path/" > /dev/null 2>&1;

done

# delete empty folders if the the folder is not changes in the last 5 minutes
find $source_path/* -mmin +5 -type d -empty -delete > /dev/null 2>&1;
    
por 31.10.2017 / 22:33
1

Você precisará de scripts para fazer isso, então você não pode fazer isso com a opção -exec diretamente (a menos que você use bash -c , o que dificulta a citação e a expansão de parâmetros).

Existem duas opções: -

  • Use find /src/backup/ | while read -r f; do ...; done - isso funcionará se você tiver nomes de arquivos normais (sem espaços iniciais / finais nem linhas novas incorporadas).
  • Chame um arquivo de script que tenha os comandos necessários, por exemplo, find /src/backup/ -mmin +60 -exec /Path/To/moveunique {} /dest/backup/ - nesse caso, recomendo colocar o caminho completo do script na linha crontab , já que seu ambiente é diferente do seu shell interativo.

Vou ilustrar a primeira opção: deve ser óbvio como usar comandos semelhantes em um arquivo de script:

find /src/backup/ | while read -r f; do \
    mv "$f" /dest/backup/"${f%/*}"/$(date -d@$(stat "$f" -c %Y) +'%Y%m%d-%H%M')-"${f##*/}"; \
done

Isso usa stat para obter o tempo de modificação do arquivo, date para formatar os campos de tempo desejados e a expansão de parâmetro para separar o caminho e o nome do diretório do arquivo.

Isso cria uma string de comando bastante longa (usei linhas de continuação para torná-la mais legível e não verifiquei se crontab suporta isso), então você prefere usar um script.

    
por 31.10.2017 / 12:53