Erros de lançamento do script de backup

0

Eu tenho o seguinte script:

#!/bin/sh

#Finds all folders and subsequent files that were modified yesterday and dumps them out to a text

updatedb && rm /tmp/*

echo $(locate -b 'date --date='yesterday' '+%Y.%m.%d'') > /tmp/files.txt

#creates variable out of the file. 

input="/tmp/files.txt"

yest=$(date --date='yesterday' '+%Y.%m.%d')

#loops through each entry of folders

while IFS= read -r folders

do

echo $folders

tar -cvf $folders\.tar $folders --remove-files

done < "$input"

e isso me dá o erro:

tar: /backup/DNS/intns1/2016.07.19: Cannot open: Is a directory

tar: Error is not recoverable: exiting now

Tentando descobrir o que estou fazendo de errado ...

    
por justswigart 20.07.2016 / 15:44

1 resposta

0

Usando versões GNU bastante recentes de date , find , tar e xargs :

Este script precisa de bash ou ksh ou zsh ou algum outro shell razoavelmente moderno que entenda substituição de processo ( <(...) )

#!/bin/bash

    today='12am today'
yesterday='12am yesterday'

# function to create a tar file for a directory but only include
# files older than "$2" but newer than "$3".  Delete any files
# added to the tar archive.
#
# the tar file will be created uncompressed in the same directory
# as the directory itself.  e.g. ./dir --> ./dir.tar
function tarit() {
  dir="$1"
  older="$2"
  newer="$3"

  tar cvf "$dir.tar" -C "$dir/.." --null --remove-files \
    -T <(find "$dir" ! -newermt "$older" -newermt "$newer" -type f -print0)
}

# we need to export the function so we can
# run it in a bash subshell from xargs
export -f tarit

# we want to find newer files but output only the path(s)
# containing them with NULs as path separator rather than
# newlines, so use '-printf '%h
#!/bin/bash

    today='12am today'
yesterday='12am yesterday'    

find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h
#!/bin/bash

    today='12am today'
yesterday='12am yesterday'

# function to create a tar file for a directory but only include
# files older than "$2" but newer than "$3".  Delete any files
# added to the tar archive.
#
# the tar file will be created uncompressed in the same directory
# as the directory itself.  e.g. ./dir --> ./dir.tar
function tarit() {
  dir="$1"
  older="$2"
  newer="$3"

  tar cvf "$dir.tar" -C "$dir/.." --null --remove-files \
    -T <(find "$dir" ! -newermt "$older" -newermt "$newer" -type f -print0)
}

# we need to export the function so we can
# run it in a bash subshell from xargs
export -f tarit

# we want to find newer files but output only the path(s)
# containing them with NULs as path separator rather than
# newlines, so use '-printf '%h
#!/bin/bash

    today='12am today'
yesterday='12am yesterday'    

find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h%pre%' |
  sort -u -z |
  xargs -0r -I {} tar cfv "{}.tar" "{}" -C "{}/.." --remove-files
''. find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h%pre%' | sort -u -z | # unique sort the directory list xargs -0r -I {} bash -c "tarit \"{}\" \"$today\" \"$yesterday\""
' | sort -u -z | xargs -0r -I {} tar cfv "{}.tar" "{}" -C "{}/.." --remove-files
''. find . ! -newermt "$today" -newermt "$yesterday" -type f -printf '%h%pre%' | sort -u -z | # unique sort the directory list xargs -0r -I {} bash -c "tarit \"{}\" \"$today\" \"$yesterday\""

OBSERVE como todas as variáveis são citadas para segurança (mesmo no sub-shell bash, usando escape entre aspas), assim como usando NUL como separador (assim o script não irá quebrar se nomes de caminho e / ou nomes de arquivos contiverem mas caracteres completamente válidos, como espaços ou novas linhas). Observe também o uso de recuo e espaços extras para melhorar a legibilidade. E comentários para explicar o que está sendo feito e por quê.

Se você quiser apenas distribuir todo o diretório e excluir o próprio diretório (e todos os arquivos contidos nele), é mais simples:

%pre%

Pessoalmente, acho que esses scripts são incrivelmente perigosos. Se você não tiver cuidado (por exemplo, executá-los como root com / em vez de . como o caminho de localização ... ou apenas executá-los no diretório / ), é possível excluir arquivos e até diretórios inteiros necessários o sistema operacional. Mesmo executá-los sob seu uid em seu diretório pessoal (ou em qualquer lugar em que você tenha acesso de gravação - o que você precisará para criar os arquivos tar de qualquer forma) pode excluir arquivos que você deseja manter.

IMO você realmente precisa repensar se realmente precisa usar a opção --remove-files de tar . O que você está tentando alcançar? Isso é algum tipo de intérprete? Em caso afirmativo, a exclusão de arquivos cegamente em /tmp poderia interromper processos demorados que, por exemplo, criaram arquivos em / tmp ontem e precisam reutilizá-los hoje ... ou amanhã.

Resumindo: Aqui está um par de espingardas carregadas. Tente não se atirar no pé com eles.

    
por 21.07.2016 / 08:00