Resultados de la tubería de localizar en rm

11

Intenté correr

locate *.orig | xargs rm

pero decía No such file or directory

He visto formas de hacerlo, findpero localizar devuelve la ruta completa al objeto, por lo que debería ser posible

soldado.moth
fuente

Respuestas:

20

Si los nombres de archivo contienen espacios, debe usar

locate -0 $something | xargs -0 rm

Desde la locatepágina del manual :

-0, --nullSepare las entradas en la salida utilizando el carácter ASCII NUL en lugar de escribir cada entrada en una línea separada. Esta opción está diseñada para la interoperabilidad con la opción --null de GNU xargs (1).

o

locate $something | while read f; do rm "$f"; done

Además, debe proteger *.origcon comillas, para evitar la expansión del shell, y pasarla para ubicarla intacta.

enzotib
fuente
¿Qué quieres decir con "expansión de shell"?
soldier.moth
+1 para tu segundo ejemplo. Siempre uso | while readporque mi directorio de inicio está lleno de archivos con espacios.
Matpie
@ Soldier.moth: si en la carpeta actual hay archivos correspondientes al patrón *.orig, el shell expandirá el patrón, por ejemplo file1.orig file2.orig ..., para que locateno vea la cadena exacta *.origcomo debería.
enzotib
También para grep localizar la salida que pueda tr '\n' '\0'.
Pablo Bianchi
2

Es xargsnoxarg

maco
fuente
Sin embargo, a eso me refería era escribir preguntas de memoria.
soldier.moth
Oh ok Parecía el error que obtendría al poner un comando incorrecto después de |
maco
0

El comando locate *.orig | xargs rmfunciona realmente, pero lo que estaba sucediendo era locateencontrar *.origarchivos en la papelera y rmescupe el error No such file or directoryal intentar eliminar archivos en la papelera.

soldado.moth
fuente
Debe agregar información como un "comentario" a la respuesta original, o puede editar la respuesta original. Esta no es una respuesta a tu propia pregunta.
enzotib 23/10/10
Es una respuesta a mi pregunta, la razón por la que recibí el error fue porque localizar estaba encontrando archivos * .orig en la papelera y rm no pudo eliminarlos. Acepté su respuesta y voté las otras dos porque estaban bien escritas y podrían ayudar a alguien que viene más tarde.
soldier.moth
0

localizar no hace el engorde, pero el caparazón sí. El shell expande * .orig a lo que encuentra en el directorio actual que coincide con * .orig.

Solo usa

locate .orig

y si eso te da lo que necesitas

locate .orig | xargs rm

o, como mencionó enzotib

locate -0 .orig | xargs -0 rm

si tiene espacios en blanco en los nombres de archivo.

usuario desconocido
fuente
0

Un truco: guardar todas las rutas en el archivo tmp. entonces, bucle en él:

#!/bin/bash
locate .orig /tmp/tmp.txt
while read line
do
    pth=$line
    rm "$pth" 
done < /tmp/tmp.txt

rm -rf /tmp/tmp.txt 
Abdennour TOUMI
fuente