Tengo un archivo de texto largo con una lista de máscaras de archivo que quiero eliminar
Ejemplo:
/tmp/aaa.jpg
/var/www1/*
/var/www/qwerty.php
Necesito borrarlos. Intenté rm `cat 1.txt` y dice que la lista es demasiado larga.
Encontré este comando, pero cuando reviso las carpetas de la lista, algunas de ellas todavía tienen archivos.
xargs rm <1.txt
La llamada rm manual elimina archivos de dichas carpetas, por lo que no hay problemas con los permisos.
Respuestas:
Esto no es muy eficiente, pero funcionará si necesita patrones globales (como en / var / www / *)
Si no tiene ningún patrón y está seguro de que sus rutas en el archivo no contienen espacios en blanco u otras cosas raras, puede usar xargs así:
fuente
Suponiendo que la lista de archivos está en el archivo
1.txt
, haga lo siguiente:La
-r
opción provoca recursividad en cualquier directorio nombrado en1.txt
.Si algún archivo es de solo lectura, use la
-f
opción para forzar la eliminación:Tenga cuidado con la entrada a cualquier herramienta que realice eliminaciones programáticas. Hacen cierto que los archivos con el nombre del archivo de entrada son realmente para ser borrados. Tenga especial cuidado con los errores tipográficos aparentemente simples. Por ejemplo, si ingresa un espacio entre un archivo y su sufijo, parecerán dos nombres de archivo separados:
es en realidad dos archivos separados:
file
y.txt
.Esto puede no parecer tan peligroso, pero si el error tipográfico es algo como esto:
A continuación, en lugar de eliminar todos los archivos que comienzan con
myoldfiles
, que va a terminar borrandomyoldfiles
y todos los no-punto-archivos y directorios en el directorio actual. Probablemente no sea lo que querías.fuente
Utilizar esta:
Si necesita una expansión global, puede omitir las citas
$file
:Pero tenga en cuenta que los nombres de archivo pueden tener contenido "problemático" y yo usaría la versión sin comillas. Imagina este patrón en el archivo
¡Esto eliminaría bastante del directorio actual! Le animo a que prepare la lista de borrado de una manera que los patrones globales ya no sean necesarios, y luego utilice comillas como en mi primer ejemplo.
fuente
/My Dir With Spaces/
/Spaces and globs/*.txt
,--file-with-leading-dashes
y como un bono que es POSIX y las obras en GNU / Linux, MacOS y BSD.Puede usar '\ n' para definir el carácter de nueva línea como delimitador.
Tenga cuidado con -rf porque puede eliminar lo que no desea si el 1.txt contiene rutas con espacios. Es por eso que el nuevo delimitador de línea es un poco más seguro.
En los sistemas BSD, puede usar la opción -0 para usar nuevos caracteres de línea como delimitadores como este:
fuente
xargs: illegal option -- d
-0
en OS X.xargs -I_ rm _
también funciona en OS X :) ver stackoverflow.com/a/39335402/266309-d
), primero puede convertir nuevas líneas en nulos:tr '\n' '\0' < 1.txt | xargs -0 rm
Puedes usar este one-liner:
Lo que hace la expansión de shell pero se ejecuta
rm
el número mínimo de veces.fuente
-n <n>
argumento axargs
para reducir el número de argumentos pasados a cada rm, pero eso aún no lo protegerá de un solo glob que exceda el límite.xargs -I{} sh -c 'rm {}' < 1.txt
debe hacer lo que quiera. Tenga cuidado con este comando, ya que una entrada incorrecta en ese archivo podría causar muchos problemas.Esta respuesta se editó después de que @tdavies señalara que el original no expandía el shell.
fuente
xargs -I{} sh -c 'rm {}' < 1.txt
En este caso particular, debido a los peligros citados en otras respuestas,
Edite, por ejemplo, en Vim y
:%s/\s/\\\0/g
, escapando todos los caracteres de espacio con una barra invertida.Luego
:%s/^/rm -rf /
, anteponiendo el comando. Con-r
usted no tiene que preocuparse de tener directorios listados después de los archivos contenidos en ellos, y con-f
eso no se quejará debido a que faltan archivos o entradas duplicadas.Ejecute todos los comandos:
$ source 1.txt
fuente
cat 1.txt | xargs rm -f | bash
Ejecutar el comando hará lo siguiente solo para archivos.cat 1.txt | xargs rm -rf | bash
Ejecutar el comando hará el siguiente comportamiento recursivo.fuente
Solo para proporcionar otra forma, también puede simplemente usar el siguiente comando
fuente
Aquí hay otro ejemplo de bucle. Este también contiene una 'instrucción if' como ejemplo de verificación para ver si la entrada es un 'archivo' (o un 'directorio' por ejemplo):
fuente
Aquí puede usar un conjunto de carpetas de deletelist.txt y evitar algunos patrones también
fuente
Esto permitirá que los nombres de archivo tengan espacios (ejemplo reproducible).
fuente
En caso de que alguien prefiera
sed
y eliminar sin expansión comodín :Recordatorio: use nombres de ruta absolutos en el archivo o asegúrese de estar en el directorio correcto.
Y para completar lo mismo con
awk
:La expansión de comodines funcionará si se eliminan las comillas simples, pero esto es peligroso en caso de que el nombre del archivo contenga espacios. Esto necesitaría agregar comillas alrededor de los comodines.
fuente