Algo que me encuentro haciendo mucho es ejecutar un comando de búsqueda y luego editarlos en vi, que se parece a esto:
> find . "*.txt"
./file1.txt
./file2.txt
./path/to/file3.txt
> vi ./file1.txt ./file2.txt ./path/to/file3.txt
¿Hay una manera inteligente y simple de hacer todo esto en una sola línea de comando?
xargs
destruir mi terminal de shell. La solución adecuada es la siguiente por @DevSolarRespuestas:
Esto debería funcionar:
Usa Vim, es mejor para tu salud. :-)
La
+
opción que a menudo se pasa por alto-exec
hace que todos los nombres de archivo (hasta los límites de longitud de línea) aparezcan en una línea, es decir, todavía se abren todos los archivos en unavim
sesión (se navega con el archivo:n
siguiente y el:N
anterior).Con
vim -p
usted obtendrá una pestaña de archivo para cada archivo. Consulte:help tab-page-commands
para más detalles.Con
vim -o
usted obtendrá ventanas divididas horizontalmente para cada archivo,vim -O
ventanas divididas verticalmente. Consulte:help window-move-cursor
para más detalles.Tenga en cuenta que la versión anterior de esta respuesta,
vim $(find . -name "*.txt")
no funciona con espacios en los nombres de archivo y tiene implicaciones de seguridad.Tubería en
xargs vi
da unWarning: Input is not from a terminal
, además de un terminal con un comportamiento completamente falso después. La gravedad del usuario explicó por qué en un comentario a continuación, y con un poco más de explicación en esta pregunta .fuente
/dev/tty
y llamar a ioctl () sobre eso; es demasiado flojo para hacerlo.) Cuando es invocado por xargs, vim recibe/dev/null
como su entrada estándar, lo que simplemente ignora los ioctls de control de terminal.vim -p
si quieres pestañas de archivo. (gt
ygT
para navegar o hacer clic con el mouse)vim
, simplemente especifique-
como primer argumento, como enecho foobar | vim -
.find . -name "*.txt" | vim -
le ofrece una sesión vim en un archivo sin nombre que contiene los nombres de los archivos encontrados, que no es lo que solicitó el OP ...O ejecuta vim y desde allí:
fuente
Además, si desea que se abran uno a la vez, también puede usar find -exec o usar un bucle for simple. Editado por el comentario de ceving.
o
fuente
-name
falta. Y segundo: el comando falla miserablemente en cuanto un nombre de archivo contiene un espacio. -1 por respuesta desacertada.Si ya escribió su
find
comando, encuentro que puede ser mucho más fácil de usarxargs
para abrir los resultados de búsqueda:La
-p
opción le dice a vim que abra cada archivo en una nueva pestaña. Creo que esto es más conveniente que solo usar buffers, pero si no lo hace, simplemente deje esa opción.fuente
Para editar todo
*.txt
, sólo puede ejecutar:vim *.txt
. Para editar archivos devueltos porfind
, lea más adelante.En Unix / macOS, puede usarlo
find
con BSDxargs
(consulte :)man xargs
, p. Ej.Relacionado: Terminal borked después de invocar a Vim con xargs en Vim.SE.
fuente