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?

xargsdestruir 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-exechace 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 unavimsesión (se navega con el archivo:nsiguiente y el:Nanterior).Con
vim -pusted obtendrá una pestaña de archivo para cada archivo. Consulte:help tab-page-commandspara más detalles.Con
vim -ousted obtendrá ventanas divididas horizontalmente para cada archivo,vim -Oventanas divididas verticalmente. Consulte:help window-move-cursorpara 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 vida 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/ttyy llamar a ioctl () sobre eso; es demasiado flojo para hacerlo.) Cuando es invocado por xargs, vim recibe/dev/nullcomo su entrada estándar, lo que simplemente ignora los ioctls de control de terminal.vim -psi quieres pestañas de archivo. (gtygTpara 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
-namefalta. Y segundo: el comando falla miserablemente en cuanto un nombre de archivo contiene un espacio. -1 por respuesta desacertada.Si ya escribió su
findcomando, encuentro que puede ser mucho más fácil de usarxargspara abrir los resultados de búsqueda:La
-popció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
findcon BSDxargs(consulte :)man xargs, p. Ej.Relacionado: Terminal borked después de invocar a Vim con xargs en Vim.SE.
fuente