Eliminar directorios de un archivo con una lista de directorios


2

Tengo una lista de directorios en un archivo de texto y cada uno de ellos debe eliminarse. ¿Cómo puedo leer esa lista en el comando ( rm -ro rmdir)?

Respuestas:


4

La solución "más correcta" sería la siguiente:

xargs -I{} rm -r {} < files

Esto llama rm -r, donde {}se reemplaza con el nombre del archivo.


¿Por qué? La canalización de archivos con espacios xargsdará como resultado argumentos incorrectos. Digamos que su lista de archivos se ve así:

/path/to/file 1
/path/to/file_2

Luego xargs rm -r < list.txtintentaría eliminar /path/to/file, 1y /path/to/file_2. Definitivamente no es lo que quieres. Siempre tenga en cuenta los espacios en las rutas al canalizar desde y hacia comandos UNIX / Linux.


¿Qué está -I{}haciendo aquí? Los documentos dicen "reemplazar cadena". Además, ¿funciona esto si las rutas de archivo de la lista de eliminación tienen espacios en ellas?
— chovy

Nombre de archivo demasiado largo
— chovy

1
Desde la página de manual: "Reemplace las ocurrencias de replace-str en los argumentos iniciales con nombres leídos de la entrada estándar". Lo más importante es que dice: "Los espacios en blanco sin comillas no terminan los elementos de entrada; en cambio, el separador es el carácter de nueva línea". Entonces, las < filesmarcas xargsreciben la lista de archivos como entrada estándar. Luego, llama al argumento inicial,, rm -ren cada línea (= nombre de archivo) recibida. Con la -Iopción, la división se realiza en base a nuevas líneas en lugar de espacios, lo que significa que esta operación es segura para rutas de archivos con espacios en ellas. No entiendo tu otro comentario.
— slhck

la lista es muy larga. si tengo más de 1000 archivos para eliminar es demasiado largo para xargs
— chovy

Probablemente pueda hacer algo como esto: cat files | tr '\n' '\0' | xargs -0 rm -r- esto reemplaza las nuevas líneas con caracteres nulos ASCII. xargsluego llamará rma cada una de las líneas recibidas por separado.
— slhck

1

suponiendo que tenga rutas con espacios en el archivo list.txt: una ruta por línea. Entonces, la siguiente forma de invocar xargs preservará los espacios:

cat list.txt | xargs -d \\n rm -r

esto no sufre de la lista de argumentos errores demasiado largos upvoting
— chovy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.