2012-04-06 9 views
6

que suelen utilizar como estovi abierta con el nombre de archivo pasado

$ find -name testname.c 
./dir1/dir2/testname.c 
$ vi ./dir1/dir2/testname.c 

que es molesto para escribir el nombre del archivo con la ubicación de nuevo.

¿cómo puedo hacer esto con un solo paso?

He intentado

$ find -name testname.c | xargs vi 

pero fallé.

+0

posible duplicación: http://stackoverflow.com/questions/5955577/bash-automatically-capture-output-of-last -executed-command-into-a-variable –

+0

Esta respuesta explica por qué la solución 'xargs' no funciona: [¿Por qué?" ubicar nombre de archivo | xargs vim "causa un comportamiento extraño en el terminal?] (http://stackoverflow.com/a/8228888/85371) – sehe

Respuesta

10

Utilice el parámetro -exec en find.

$ find -name testname.c -exec vi {} \; 

Si su find devuelve varios partidos, sin embargo, se abrirán los archivos de forma secuencial. Es decir, cuando cierras uno, se abrirá el siguiente. No los pondrás todos en fila en los buffers.

Para llegar a todos ellos abiertos en tampones, utilice:

$ vi $(find -name testname.c) 

¿Es esto realmente vi, por cierto, y no Vim, a la que vi es a menudo un alias hoy en día?

+0

Agregando un + en lugar de \; encontrar sería mejor para abrir múltiples archivos. + la sintaxis es definida por POSIX y debería estar disponible. – jordanm

4

El problema es xargs se incorporan todas de entrada vi 's allí (y no teniendo otro recurso, a continuación, transmite /dev/null a vi porque la alternativa es pasar el resto de la lista de archivos), no dejando ninguna manera para que pueda interactuar con eso Es posible que desee utilizar un subcomando lugar:

$ vi $(find -name testname.c) 

Lamentablemente no hay sencilla fc o r invocación que puede hacer esto para usted fácilmente después de que haya ejecutado la primera find, aunque es bastante fácil añadir los caracteres a la vez fines del comando después del hecho.

+0

¿Puedo preguntarte algo? ¿Quiere decir que 'xargs' no solo pasa el'./dir1/dir2/testname.c' en este ejemplo? –

+0

Los descriptores de archivos son heredados; normalmente 'vi' hereda su entrada del shell, cuya entrada es su terminal, pero cuando usa' xargs' al final de una tubería, la entrada heredada sería la tubería. 'xargs' no quiere dar la canalización al programa que está ejecutando (ya que en el mejor de los casos está pasando una tubería consumida y en el peor de los casos, el programa consumiría la entrada destinada a' xargs') por lo que sustituye '/ dev/null'. – geekosaur

3

Mi solución favorita es utilizar del mismo vim: Shell

:args `find -name testname.c` 

Por cierto, VIM ha englobamiento extendido incorporado, por lo que se puede decir simplemente

:args **/testname.c 

que se encuentra de forma recursiva en el árbol de directorios sub .

no también, que VIM tiene nombres de archivos en la línea de comandos, así que si usted sabe que está realmente en busca de un solo archivo, intente

:e **/test 

y presione Tab (repetidamente) para cambiar entre cualquier nombres de archivo matchin en el árbol subdirectorio.

1

Para algo un poco más robusto que vi $(find -name testname.c) y similares, lo siguiente protegerá contra nombres de archivos con espacios en blanco y otros caracteres de shell interpretados (si tiene nuevas líneas incrustadas en sus nombres de archivo, que Dios lo ayude). Inyectar esta función en su entorno de shell:

# Find a file (or files) by name and open with vi. 
function findvi() 
{ 
    declare -a fnames=() 
    readarray -t fnames < <(find . -name "$1" -print) 
    if [ "${#fnames[@]}" -gt 0 ]; then 
     vi "${fnames[@]}" 
    fi 
} 

A continuación, utilice como

$ findvi Classname.java 
Cuestiones relacionadas