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.