¿Qué hay de malo en este comando "buscar todos los archivos de intercambio de vim y eliminarlos con una confirmación"?

¿Qué hay de malo en este comando "buscar todos los archivos de intercambio de vim y eliminarlos con una confirmación"?

Estoy intentando eliminar todos los archivos de intercambio de vim *.swpy eliminarlos con una confirmación. El findcomando encontró los archivos, pero rmdice No such file or directorycon la -iopción. Cuando codifico la ruta del archivo y simplemente rm -ilo uso, parece funcionar.

Vea abajo

(doors)hobbes3@hobbes3 ~/Sites $ find mysite mysite_BAK -name *.swp -exec 'rm -i {}' \;
find: rm -i mysite/templates/.base.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.create.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.detail.html.swp: No such file or directory
find: rm -i mysite/templates/doors/orders/.list.html.swp: No such file or directory
(doors)hobbes3@hobbes3 ~/Sites $ rm -i mysite/templates/.base.html.swp 
remove mysite/templates/.base.html.swp? n

Supongo que estoy haciendo algo mal con la -execopción. ¿Alguna sugerencia? ¡Gracias de antemano!

Respuesta1

El error es generado porencontrar, nohabitación.

La razón es que usted lo ha escrito, por lo que 'rm -i <file>'es el único argumento. Esto se reescribirá:

find mysite mysite_BAK -name '*.swp' -exec rm -i '{}' \;

entonces find obtiene múltiples argumentos después de "-exec" y trata el primero como comando y los demás como argumentos del comando.

Respuesta2

RESPUESTA ACTUALIZADA:

Si estás usando la versión >4.0 de bash, puedes usar la función globstar, es muy fácil:

shopt -s globstar
rm -i **/*.swp

¡Esto también funciona con nombres de archivos que contienen espacios!

La shopt -s globstarparte activará la **coincidencia recursiva en bash. Puedes poner esto en tu .bashrcy ser feliz por siempre jamás.

ANTIGUA RESPUESTA:

Generalmente me resulta más fácil usar herramientas simples combinadas.

cd a dir y luego:

rm -i `find . | grep .swp$`

¡Es más fácil de recordar (si el rendimiento no es un problema)!

Advertencia: utilice esto únicamente si los nombres de sus archivos no contienen espacios.

Respuesta3

En tu caso yo correría

find mysite mysite_BAK -type f -name .\*.sw? -exec rm -i {} ";"

El archivo de intercambio de VIM no sólo termina en .swp. Si existe .swp, VIM creará .swo, luego .swn, y así sucesivamente. Además, los archivos de intercambio tienen el prefijo un punto (.), por ejemplo, .file1.rb.swp.

Otras formas de buscar y eliminar archivos de intercambio de VIM, sin la confirmación (-i):

find some_dir -type f -name .\*.sw? | xargs rm 
find some_dir -type f -name .\*.sw? -exec rm {} ";"
find some_dir -type f -name .\*.sw? -delete  # -delete option does not work in Git Bash

Sin "-type f", obtendría un error al eliminar un directorio. Además, lo \hace .\*.sw?compatible en múltiples plataformas.

información relacionada