4 votos

Mi comando de una línea 'eliminar archivos antiguos' encuentra los archivos correctos pero no los eliminará

Este comando encuentra correctamente todos los archivos en el directorio que son más antiguos que 1 día:

$ find /Users/[me]/test -type f ! -newermt -1day | xargs -0 -n1
/Users/[me]/test/1.txt
/Users/[me]/test/2.txt

Sin embargo, cuando cambio el parámetro de 'xargs' para eliminarlos, arroja un error:

$ find /Users/[me]/test -type f ! -newermt -1day | xargs -0 rm
rm: /Users/[me]/test/2.txt
/Users/[me]/test/1.txt
: No such file or directory

¿Alguien sabe cuál es el problema y cómo solucionarlo?

¿O tal vez hay una mejor manera de hacer esto? (¡No estoy muy familiarizado con la línea de comandos de macOS, como probablemente puedes darte cuenta!)

19voto

find puede eliminar directamente.

find /Users/[me]/test -type f ! -newermt -1day -delete

16voto

siva Puntos 23

Mientras hay banderas alternativas para find como -delete y -print0, para responder la pregunta de cuál es el problema con xargs y cómo arreglar ese problema…

xargs -0 espera que el carácter nulo separe los argumentos.
find muestra resultados separados por un salto de línea.

Por lo tanto, xargs ve el resultado de find como

/Users/[me]/test/2.txt\n/Users/[me]/test/1.txt
#                     ^^ salto de línea

lo cual cuenta como un solo argumento.

rm intenta remover el archivo con ese nombre (que contiene un salto de línea), lo que se puede pensar como ejecutar

rm "/Users/[me]/test/2.txt\n/Users/[me]/test/1.txt"

(donde \n sería un salto de línea) el cual no puede encontrar.

Remueva -0 de xargs para separar por salto de línea y así ejecutar

rm "/Users/[me]/test/2.txt" "/Users/[me]/test/1.txt"

O, para hacerlo más robusto y capaz de manejar nombres de archivo arbitrarios, incluyendo aquellos que podrían tener un \n en el nombre del archivo en sí mismo, use

find /Users/[me]/test -type f ! -newermt -1day -print0 | xargs -0 -rm

5voto

Fuente del problema explicado en la respuesta de @grg. Aquí tienes una solución alternativa:

Necesitas agregar -print0 a los argumentos de find.

find /Users/[yo]/test -type f ! -newermt -1day -print0 | xargs -0 rm

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X