Una de las tareas básicas de administración de sistemas de archivos consiste en crear, modificar y eliminar distintos tipos de archivos y directorios. Conocer algunas herramientas y conceptos básicos para la eliminación de archivos resulta muy útil y puede ahorrarle tiempo.
Linux ofrece varias herramientas que pueden ayudarnos a realizar tareas de eliminación de archivos. A menudo necesitamos eliminar no sólo uno, sino varios archivos y directorios, basándonos en algunos criterios. Es útil conocer algunos comandos comunes y sus combinaciones para realizar nuestra tarea con facilidad.
- Utilice los siguientes comandos con precaución, especialmente los que utilizan expresiones regulares o algunos patrones de búsqueda con el comando find. Una expresión o patrón incorrecto puede borrar datos esenciales/archivos del sistema o simplemente archivos no deseados.
- Asegure siempre la última copia de seguridad de los datos y archivos de sistema importantes.
- Tenga cuidado antes de ejecutar este tipo de comandos especialmente cuando lo ejecute con Sudo o como superusuario (root).
Eliminar utilizando unlink
No es tan popular. Para eliminar un único archivo de forma permanente, podemos utilizar el comando unlink
.
$ unlink {nombre-archivo}
Eliminar archivo único
Existe un comando más utilizado para eliminar archivos, el comando rm
, que permite eliminar uno o más archivos simultáneamente.
$ rm {nombre-archivo}
rm
le pide que confirme la eliminación de los archivos que están protegidos contra escritura, de lo contrario procede a eliminar directamente el archivo. Para que rm
le pregunte siempre antes de borrar un fichero, utilice la bandera -i
:
$ rm -i {nombre-archivo}
el comandorm
borra sin mostrar ningún mensaje en pantalla. Para listar lo que el comando rm
está haciendo realmente, utilice rm con la bandera -v
.
$ rm -v {nombre-archivo}
Para eliminar archivos protegidos contra escritura sin pedir confirmación, utilice la bandera -f
.
$ rm -f {nombre-archivo}
Eliminar varios archivos
Se pueden eliminar múltiples ficheros especificando varios nombres de fichero a rm
como argumentos.
$ rm {nombre-de-archivo-1} {nombre-de-archivo-2} {nombre-de-archivo-3} ... {nombre-de-archivo-N}
rm
también admite expresiones regulares. Si desea eliminar todos los archivos con el nombre nombre-archivo-*
, puede utilizar:
$ rm nombre-archivo-*
También podemos especificar varios archivos utilizando expresiones regulares. Si queremos borrar tres archivos que coincidan con nombre-de-archivo-1
, nombre-de-archivo-2
y nombre-de-archivo-3
, podemos usar algo como
$ rm nombre-archivo-[123]
Eliminar directorio
Se puede eliminar un directorio vacío utilizando el comando rm
con la opción -d
.
$ rm -d {nombre-directorio}
Las opciones admitidas para la eliminación de archivos también pueden combinarse con la eliminación de directorios utilizando también la bandera -d
. Por ejemplo
$ rm -idv {nombre-directorio}
Para eliminar un directorio que no está vacío utilice la bandera -r
.
$ rm -r {nombre-del-directorio}
Si no desea ningún aviso antes de borrar el directorio y su contenido, utilice la bandera -rf
. Esto BORRARÁ todo dentro del directorio incluyendo el directorio mismo sin ninguna confirmación. Tenga cuidado al usarlo, especialmente como root.
$ rm -rf {nombre-directorio}
Buscar y eliminar archivos
Para requerimientos más complejos, podemos utilizar el comando find con diferentes opciones. Para eliminar todos los archivos que coincidan con el patrón {pattern}
dentro de una ruta dada por {dir-to-search}
$ find {dir-a-buscar} -tipo f -nombre {patrón} -exec rm -f {} \;
Ejemplo:
$ find /var/tmp -type f -name "*.tmp" -exec rm -f {} \;
Si queremos eliminar todo lo que coincida con un patrón {pattern}
, incluidos los directorios dentro de {dir-to-search}
, podemos modificar ligeramente el comando anterior como:
$ find {directorio-a-buscar} -nombre {patrón} -exec rm -rf {} \;
Las versiones modernas del comando find soportan internamente la función delete. Aquí la bandera -delete
sustituye al comando rm mientras que -depth
ordena al comando find que procese primero el contenido del directorio antes que el propio directorio :
$ find {directorio-a-buscar} -tipo f -nombre {nombre-archivo-patrón} -profundidad -borrar
El ejemplo anterior es más eficiente cuando se trabaja con un gran número de archivos, ya que no genera un nuevo proceso externo para el comando rm
por cada archivo coincidente. Pero no todas las versiones del comando find
(todavía) soportan la bandera -delete
. Como alternativa, tenemos la opción de utilizar el comando xargs
con find
como se muestra en el siguiente ejemplo
$ find {dir-a-buscar} -tipo f -nombre {patrón} -print0 | xargs -0 rm
O utilice el terminador
del comando exec para encadenar todo lo encontrado por el comando find como xargs:
$ find {dir-to-search} -name {patrón} -exec rm -rf {}
Por defecto, el comando find utiliza la bandera -print
que normalmente omitimos escribir. Con xargs
, necesitamos evitar el carácter de nueva línea
entre cada nombre de archivo. Por ello, la bandera -print0
indica a find que imprima un carácter nulo
después de cada nombre de archivo encontrado.
De manera similar, especificamos la bandera -0
con xargs
para que ambos comandos se acoplen. El comando rm
aquí borra el archivo pasado por la entrada piped find
. Por ejemplo, el comando siguiente buscará y eliminará todos los archivos * .tmp
del directorio personal del usuario actual (dado por el símbolo ~
).
$ find ~ -name "*.tmp" -print0 | xargs -0 rm
el comandofind
ofrece varias formas de buscar archivos y directorios, incluyendo propiedad, permiso, marca de tiempo, etc. Cubriremos algunas de estas formas que pueden ayudarnos en tareas específicas de eliminación de archivos.
Buscar y eliminar archivos por un usuario
Para eliminar todo lo que se encuentre dentro de un directorio determinado que pertenezca a un usuario
específico, utilice
$ find {directorio-a-buscar} -mindepth 1 -user {nombre-usuario} -delete
En el ejemplo anterior, la bandera -mindepth
con valor 1 impide que se elimine el directorio dado por {dir-to-search}
si coincide con el patrón y los criterios de búsqueda. O para borrar todo lo que haya dentro de un directorio dado que pertenezca a un grupo
determinado, utilice
$ find {dir-to-search} -mindepth 1 -group {nombre-del-grupo} -delete
Si no desea recorrer los subdirectorios bajo la ruta de búsqueda, también tiene la opción de utilizar -maxdepth
con el valor de profundidad de directorio apropiado.
He aquí un ejemplo de ejecución:
$ find tempdir/ -mindepth 1 -maxdepth 1 -user abhisheknair -group abhisheknair -delete
Si en su lugar desea especificar user-id
y group-id
, puede intentar algo como
$ find {dir-a-buscar} -mindepth 1 -uid {id-usuario} -gid {id-grupo} -delete
Encontrar y eliminar directorios vacíos
Para eliminar todos los directorios vacíos dentro de una ruta dada {dir-to-search}
, puede utilizar:
$ find {dir-a-buscar} -tipo d -vacío -borrar
En cambio, para borrar todos los archivos vacíos dentro de una ruta dada {dir-a-buscar}
, utilice:
$ find {dir-a-buscar} -tipo f -vacío -borrar
Buscar y eliminar archivos anteriores a X
En ocasiones, puede que necesite eliminar archivos con una
antigüedad superior a x días. find dispone de opciones para leer las horas de creación(ctime
), acceso(atime
) y modificación(mtime
) de los archivos. Podemos utilizar la opción mtime
con find para encontrar y borrar archivos modificados hace más de x
días.
$ find {dir-a-buscar} -tipo f -mtime {X} -delete
Por ejemplo, para borrar todos los archivos con extensión log dentro de /var/tmp
con un tiempo de modificación de hace 30 días o más, podemos utilizar:
$ find /var/tmp -name "*.log" -type f -mtime 30 -delete
Buscar y eliminar archivos por permiso
Ahora, también podemos eliminar archivos basándonos en algún permiso específico, como por ejemplo
$ find {dir-to-search} -nombre {patrón} -perm {NNN} -eliminar
Ejemplo:
$ find /var/tmp -nombre "temp*" -perm 755 -delete
O si queremos utilizar una forma simbólica para el permiso, utilice
$ find {dir-to-search} -nombre {patrón} -perm u={rwx},g={rwx},o={rwx} -delete
Ejemplo:
$ find /var/tmp -name "temp*" -perm u=rwx,g=rw,o=rw -delete
Resumiendo
Linux ofrece comandos unlink
, rm
y rmdir
que son sencillos y pueden ampliarse fácilmente con el uso de expresiones regulares. Para necesidades más avanzadas, tiene la opción de utilizar una combinación de herramientas como find
y xargs
para conseguir lo que necesita. Aparte de los ejemplos de este artículo, tiene la opción de utilizar find con cualquiera de sus banderas disponibles para personalizar su búsqueda. Consulte las páginas man de los comandos respectivos para saber más sobre ellos.
Ejecute siempre los comand os find sin la bandera rm
o -delete
y analice su salida para saber qué archivos o directorios se verán afectados por la ejecución de un comando real. Tener una configuración y una política de copias de seguridad adecuadas ayuda no sólo en caso de borrados accidentales, sino también en casos de fallos de hardware y ciberataques.