Hoy me he encontrado el siguiente problema al intentar borrar un archivo en Windows que curiosamente tenía un supuesto espacio al final de la extensión. Esto estaba provocando que no lo pudiera borrar ni desde línea de comandos (cmd) ni desde explorer. El error que recibía era como si el fichero no existiese:
Error Deleting File or Folder:
“Cannot read from the source file or disk”
Por suerte he encontrado este artículo de dotsmart.net en el que ofrece una solución perfecta para eliminar estos archivos/carpetas.
Por ejemplo, tenemos un fichero que no podemos borrar en esta ruta:
“C:\Alex\fichero_a_borrar.txt ”
Para poder listarlo o borrarlo, debemos anteponer el prefijo “\\?\” a la ruta completa del fichero, de ese modo podremos trabajar con él sin problemas. Lo hacemos desde la línea de comandos (Inicio -> Ejecutar -> cmd):
dir "\\?\C:\Alex\fichero_a_borrar.txt "
Y borrarlo:
del "\\?\C:\Alex\fichero_a_borrar.txt "
Por muchos motivos, podemos necesitar que ciertos ficheros dentro de un sistema Linux tengan una protección total ante su borrado, incluso para usuarios administradores (root) quienes por equivocación o descuido, pudieran borrar ese fichero.
Existe la posibilidad, con el comando chattr. Este comando permite cambiar los atributos de los ficheros en sistemas de ficheros ext2 y ext3 (en otros sistemas, como BSD el comando es chflags y en Windows attrib).
Para bloquear el borrado o modificación de un fichero para cualquier usuario de un sistema, necesitamos configurar el bit “immutable”, +i del comando chattr:
# chattr +i fichero
Hay que tener en cuenta, que para visualizar los atributos/bits asignados a ficheros con chattr, debemos usar el comando lsattr:
# lsattr fichero
----i------------e- fichero
Si quisieramos deshacer la operación, podemos quitar el bit immutable con el parámetro -i:
# chattr -i fichero
En otra entrada explicaré el resto de atributos disponibles con el comando chattr, y también como hacerlo en otros sistemas operativos.
Existen varias formas de vaciar el contenido de ficheros en sistemas Unix desde la línea de comandos, algunas de ellas son las siguientes:
# echo "" > fichero
# > fichero
# :> fichero
# cat /dev/null > fichero
# true > fichero
Por defecto, rsync no elimina los ficheros antiguos en el servidor de destino de la copia. Esto implica que pese a que haya ficheros en el sistema del que estamos haciendo copias de seguridad que ya han sido eliminados, permanecerán por siempre en el sistema de copias de seguridad (destino) a no ser que los eliminemos manualmente.
Las opciones para forzar que cada vez que ejecutemos rsync también se eliminen en el destino ficheros y carpetas que ya no existen en el origen son las siguientes:
--del an alias for --delete-during
--delete delete extraneous files from destination dirs
--delete-before receiver deletes before transfer (default)
--delete-during receiver deletes during transfer, not before
--delete-after receiver deletes after transfer, not before
--delete-excluded also delete excluded files from destination dirs
--ignore-errors delete even if there are I/O errors
--force force deletion of directories even if not empty
--max-delete=NUM don't delete more than NUM files
La opción más básica es –delete, aunque podemos personalizar aún más y elegir si deseamos que los ficheros a borrar se eliminen antes de la transferencia de ficheros (–delete-before, es lo mismo que –delete), después (-delete-after) o durante (–delete-during). Además de esto podemos elegir si ignorar errores y borrar pese a fallos de I/O, forzar eliminación de directorios no vacíos, etc.
Ejemplo de rsync con sincronización y borrado de archivos:
#!/bin/sh
# This script does personal backups to a rsync backup server. You will end up
# with a 7 day rotating incremental backup. The incrementals will go
# into subdirectories named after the day of the week, and the current
# full backup goes into a directory called "current"
# tridge@linuxcare.com
# directory to backup
BDIR=/home/$USER
# excludes file - this contains a wildcard pattern per line of files to exclude
EXCLUDES=$HOME/cron/excludes
# the name of the backup machine
BSERVER=owl
# your password on the backup server
export RSYNC_PASSWORD=XXXXXX
########################################################################
BACKUPDIR=`date +%A`
OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES
--delete --backup --backup-dir=/$BACKUPDIR -a"
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
# the following line clears the last weeks incremental directory
[ -d $HOME/emptydir ] || mkdir $HOME/emptydir
rsync --delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/
rmdir $HOME/emptydir
# now the actual transfer
rsync $OPTS $BDIR $BSERVER::$USER/current
Comentarios recientes