GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo eliminar todos los directorios .svn de los directorios de mi aplicación

No se necesitan pipes, xargs, exec ni nada:

find . -name .svn -delete

Editar: Es broma, evidentemente -delete llamadas unlinkat() bajo el capó, por lo que se comporta como unlink o rmdir y se negará a operar en directorios que contengan archivos.


Lo que escribió envía una lista de nombres de archivo (y rutas) separados por saltos de línea a rm , pero rm no sabe qué hacer con esa entrada. Solo espera parámetros de línea de comando.

xargs toma entradas, generalmente separadas por nuevas líneas, y las coloca en la línea de comando, por lo que agregar xargs hace que funcione lo que tenía:

find . -name .svn | xargs rm -fr

xargs es lo suficientemente inteligente como para pasar tantos argumentos a rm como puede aceptar. Por lo tanto, si tuviera un millón de archivos, podría ejecutar rm 1,000,000/65,000 veces (si su shell pudiera aceptar 65,002 argumentos en la línea de comando {65k archivos + 1 para rm + 1 para -fr}).

Como las personas han señalado hábilmente, lo siguiente también funciona:

find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf

Los dos primeros -exec ambos formularios llaman rm por cada carpeta que se elimina, por lo que si tiene 1 000 000 de carpetas, rm sería invocado 1.000.000 de veces. Esto es ciertamente menos que ideal. Implementaciones más recientes de rm le permite concluir el comando con un + indicando que rm aceptará tantos argumentos como sea posible:

find . -name .svn -exec rm -rf {} +

La última versión de find/xargs usa print0, lo que hace que find genere una salida que usa \0 como un terminador en lugar de una nueva línea. Dado que los sistemas POSIX permiten cualquier carácter excepto \0 en el nombre del archivo, esta es realmente la forma más segura de asegurarse de que los argumentos se pasen correctamente a rm o la aplicación que se está ejecutando.

Además, hay un -execdir que ejecutará rm desde el directorio en el que se encontró el archivo, en lugar del directorio base y un -depth eso comenzará primero en profundidad.


Prueba esto:

find . -name .svn -exec rm -rf '{}' \;

Antes de ejecutar un comando como ese, a menudo me gusta ejecutar este primero:

find . -name .svn -exec ls '{}' \;

Linux
  1. ¿Cómo hago una lista recursiva de todos los directorios en una ubicación, primero en amplitud?

  2. ¿Cómo puedo hacer que `find` ignore los directorios .svn?

  3. ¿Cómo ignorar directorios/archivos en Subversion?

  4. Cómo eliminar todos los contenedores de Docker

  5. ¿Cómo encontrar / enumerar todos los archivos únicos en dos directorios?

Cómo quitar (eliminar) directorio en Linux

Cómo encontrar todas las fuentes instaladas desde la línea de comandos en Linux

Cómo quitar un comando del historial en Linux

Cómo quitar (^M) caracteres de un archivo en Linux

Cómo quitar todos los caracteres de espacio en blanco de un archivo de texto

¿Cómo eliminar Swap Space de Centos 7.x?