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)?

Adam Schiavone
fuente

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.

slhck
fuente
¿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
Frg
fuente
esto no sufre de la lista de argumentos errores demasiado largos upvoting
chovy