Il y a un problème - Besoin de stocker la sauvegarde de la base de données sur le FTP. Sur le FTP ne doit pas dépasser 10 sauvegères, c'est-à-dire après avoir ajouté que la sauvegarde à FTP doit être supprimée, les fichiers les plus anciens pour rendre le nombre total de fichiers ne peuvent pas dépasser 10 pièces.
Comment pouvons-nous mettre en œuvre un tel retrait du FTP?
J'essaie d'écrire un script, mais ne fonctionne pas Supprimer:
5 Réponses :
N'utilisez pas FTP (pour de nombreuses raisons). Cependant, si vous faites cela dans SSH, vous obtenez un TTY, un environnement et tout le reste. De plus, si vous souhaitez que un fichier de 10 jours soit supprimé (et non un 10 jours calendrier, sale) Un simple Recherche -Mtime +10 -Delete code> remplacerait cela pour la boucle. Ainsi:
ssh user@host 'find $DIR -mtime +10 -delete'
Ceci est un script que j'ai écrit pour supprimer tous les fichiers sur un site FTP distant de plus de 7 jours. Il fonctionne en récupérant une liste du répertoire, à l'analyse de la date modifiée, puis à nouveau à supprimer tous les fichiers plus âgés que les ndays.
Je soupçonne que les chiffres codés dur dans la boucle (la date d'élément) peuvent changer en fonction de la configuration de votre système. La mise en forme de retour de la commande LS dépend des paramètres du système local. P>
supposant que vos sauvegardes sont tous les jours, puis réglage Ndays à 10 pourrait résoudre votre problème. P>
#!/bin/bash # get a list of files and dates from ftp and remove files older than ndays ftpsite="ftp.yourserver.com" ftpuser="loginusername" ftppass="password" putdir="/public_ftp/admin/logs" ndays=7 # work out our cutoff date MM=`date --date="$ndays days ago" +%b` DD=`date --date="$ndays days ago" +%d` echo removing files older than $MM $DD # get directory listing from remote source listing=`ftp -i -n $ftpsite <<EOMYF user $ftpuser $ftppass binary cd $putdir ls quit EOMYF ` lista=( $listing ) # loop over our files for ((FNO=0; FNO<${#lista[@]}; FNO+=9));do # month (element 5), day (element 6) and filename (element 8) #echo Date ${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]} File: ${lista[`expr $FNO+8`]} # check the date stamp if [ ${lista[`expr $FNO+5`]}=$MM ]; then if [[ ${lista[`expr $FNO+6`]} -lt $DD ]]; then # Remove this file echo "Removing ${lista[`expr $FNO+8`]}" ftp -i -n $ftpsite <<EOMYF2 user $ftpuser $ftppass binary cd $putdir delete ${lista[`expr $FNO+8`]} quit EOMYF2 fi fi done
Très agréable! Mais pourquoi déconnectez-vous et reconnectez-vous entre des fichiers? Laissez la connexion ouverte.
Grand script merci :) Mais j'ai une erreur "Valeur trop grande pour la base (jeton d'erreur est" 08 ")" Lorsque $ DD est 0x il est interprété comme x en octal (problème pour 8 et 9)
Supprimer des fichiers plus âgés que JUL 06 EMPRESS DATE FTP 12672814 Fichier FTP 12672813 Fichier: 1 Date FTP 12672913 Fichier: 1 Date FTP 12672913 Fichier: 7 Date FTP 1099121178 Fichier: 7 Date FTP 1099121165 Fichier: 1 Date FTP 1099121206 Fichier: 7 Date de date: Supprimer Essayer 62.210.17.5 ... (Fichier distant) Impossible de supprimer Quitter: Aucun fichier ou répertoire de ce type code>
Je vois un bug ici! Peut-être que mon mauvais, mais si le mois de changement de mois, par exemple 5 sept et 7 jours avant le 29 août, les nouvelles sauvegardes supprimeront dans ces conditions! tt = code> date --Date = "$ ndnays il y a des jours" +% s``` est une meilleure condition
Celui-ci traite de SFTP et dispose d'une vérification de la date appropriée car le script de @graeme fonctionne seulement dans un mois:
#!/bin/bash # get a list of files and dates from ftp and remove files older than ndays ftpsite="sftp -b- -oIdentityFile=<KEYFILE> -oPort=<PORT> <USER>@<HOST>" putdir="/data" ndays=19 # work out our cutoff date MM=`date --date="$ndays days ago" +%b` DD=`date --date="$ndays days ago" +%d` TT=`date --date="$ndays days ago" +%s` echo removing files older than $MM $DD # get directory listing from remote source echo " cd $putdir ls -l "|$ftpsite >dirlist # skip first three and last line, ftp command echo listing="`tail -n+4 dirlist|head -n-1`" lista=( $listing ) # loop over our files for ((FNO=0; FNO<${#lista[@]}; FNO+=9));do # month (element 5), day (element 6) and filename (element 8) # echo Date ${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]} File: ${lista[`expr $FNO+8`]} fdate="${lista[`expr $FNO+5`]} ${lista[`expr $FNO+6`]} ${lista[`expr $FNO+7`]}" sdate=`date --date="$fdate" +%s` # check the date stamp if [ $sdate -lt $TT ] then # Remove this file echo "$MM $DD: Removing ${lista[`expr $FNO+5`]} / ${lista[`expr $FNO+6`]} / ${lista[`expr $FNO+8`]}" $ftpsite <<EOMYF2 cd $putdir delete ${lista[`expr $FNO+8`]} quit EOMYF2 fi done
Voici une solution plus courte utilisant Il a deux inconvénients cependant: p> lftp code>, qui fonctionnera également avec des sous-répertoires:
Il a passé plusieurs années et, tandis que La réponse de Graeme m'a aidé mais je suis confronté à certains problèmes et voici comment Pour les réparer.
Parfois, la phrase comme Essayer AAAA: BBB: CCC: DDDD :: 0 ... code> est à la première ligne de la liste code> Varable. Vous devez le supprimer. P>
MM=$(tr -dc '0-9' <<< $MM)
DD=$(tr -dc '0-9' <<< $DD)
MM=${MM#0}
DD=${DD#0}