O primeiro problema no seu código é que você está analisando ls
. Isso significa que ele quebrará com muita facilidade, se você tiver espaços em seus nomes de arquivos ou diretórios, por exemplo. Você deve usar o shell globbing ou find
.
Um problema maior é que você não está lendo os dados corretamente. Seu código:
ls -1 | while read A DATE B FILE
nunca preencherá $FILE
. A saída de ls -1
é apenas uma lista de nomes de arquivos, portanto, a menos que esses nomes de arquivo contenham espaço em branco, somente a primeira das quatro variáveis que você fornecer a read
será preenchida.
Aqui está uma versão funcional do seu script:
#!/usr/bin/env bash
DELETE_OTHERS=yes
BACKUPS_PATH=/mnt/\!ARCHIVE/\!backups
THRESHOLD=$(date -d "3 days ago" +%Y%m%d%H%M)
## Find all files in $BACKUPS_PATH. The -type f means only files
## and the -maxdepth 1 ensures that any files in subdirectories are
## not included. Combined with -print0 (separate file names with ls -1 | while read A DATE B FILE
),
## IFS= (don't break on whitespace), "-d ''" (records end on '#!/usr/bin/env bash
DELETE_OTHERS=yes
BACKUPS_PATH=/mnt/\!ARCHIVE/\!backups
THRESHOLD=$(date -d "3 days ago" +%Y%m%d%H%M)
## Find all files in $BACKUPS_PATH. The -type f means only files
## and the -maxdepth 1 ensures that any files in subdirectories are
## not included. Combined with -print0 (separate file names with %pre%),
## IFS= (don't break on whitespace), "-d ''" (records end on '%pre%') , it can
## deal with all file names.
find ${BACKUPS_PATH} -maxdepth 1 -type f -print0 | while IFS= read -d '' -r file
do
## Does this file name match the pattern (13 digits, then .zip)?
if [[ "$(basename "$file")" =~ ^[0-9]{12}.zip$ ]]
then
## Delete the file if it's older than the $THR
[ "$(basename "$file" .zip)" -le "$THRESHOLD" ] && rm -v -- "$file"
else
## If the file does not match the pattern, delete if
## DELETE_OTHERS is set to "yes"
[ $DELETE_OTHERS == "yes" ] && rm -v -- "$file"
fi
done
') , it can
## deal with all file names.
find ${BACKUPS_PATH} -maxdepth 1 -type f -print0 | while IFS= read -d '' -r file
do
## Does this file name match the pattern (13 digits, then .zip)?
if [[ "$(basename "$file")" =~ ^[0-9]{12}.zip$ ]]
then
## Delete the file if it's older than the $THR
[ "$(basename "$file" .zip)" -le "$THRESHOLD" ] && rm -v -- "$file"
else
## If the file does not match the pattern, delete if
## DELETE_OTHERS is set to "yes"
[ $DELETE_OTHERS == "yes" ] && rm -v -- "$file"
fi
done