Me gustaría abrir todos los archivos de texto que son el resultado de un comando ls usando un editor de texto. ¿Cómo hago esto?
Me gustaría abrir todos los archivos de texto que son el resultado de un comando ls usando un editor de texto. ¿Cómo hago esto?
Respuestas:
Gilles tiene toda la razón , ls
es un mal ejemplo porque la expansión global de nombre de archivo se puede hacer mucho más fácil en la línea de comandos sin tener que usarla ls
. Si sus llamados "archivos de texto" tienen extensiones de nombre de archivo para identificarlos, puede hacer algo como esto:
editor-command *.txt
En aras de demostrar una técnica, usemos un ejemplo más complicado que no podría hacerse con solo una coincidencia de nombre de archivo y abrir archivos basados en el contenido en lugar de solo el nombre del archivo. Digamos que desea abrir todos los archivos que contenían la cadena "tipo de contenido".
Suponiendo que su editor acepte múltiples nombres de archivos y los abra todos a la vez en búferes separados o que trabaje secuencialmente a través de ellos, simplemente puede ejecutar:
editor-command $(grep -i content-type)
Ahora volviendo a su pregunta original, digamos que no sabe si son archivos de texto o no basados en sus nombres. A continuación, deberá utilizar otro programa para identificarlos y luego abrirlos en función de esos datos. El programa file
le dirá qué tipo de archivo es algo, y puede seleccionar esa lista solo para archivos de texto y luego abrir solo los nombres de archivo coincidentes como este:
editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)
La salida de la cadena de comandos dentro de la $()
construcción se utilizará como argumentos para el editor. A veces hago esto en dos etapas. Digamos que estoy revisando un conjunto de archivos y obtengo una lista de cada archivo xml que contiene la cadena "content-type"
find -type f -iname '*xml' | xargs grep -Hi 'content-type' | cut -d: -f1
... y decido que quiero abrirlos. Luego uso el último acceso directo del historial de comandos y hago esto:
vim $(!!)
... para abrir todos los resultados del comando anterior en vim, mi editor favorito.
Si su editor solo acepta un archivo a la vez y necesita seguir generando editores, deberá usar una variante del bucle xargs
o for
en la respuesta de jmtd dependiendo de si está utilizando un editor basado en terminal que necesita stdio.
Para abrir todos los archivos llamados algo .txt
(es decir *.txt
) en el directorio actual:
$EDITOR *.txt
donde $EDITOR
es su editor favorito, por ejemplo gedit *.txt
, nano *.txt
, vim *.txt
, emacs *.txt
o lo que sea. Use solo *
para hacer coincidir todos los archivos en el directorio actual.
Tenga en cuenta que el ls
comando no está involucrado. El trabajo de ls
realmente no es mostrar una lista de archivos, aunque eso sucede cuando lo invoca en un directorio. Lo que ls
es útil es mostrar los atributos del archivo (tiempo de modificación, permisos, tamaño, etc.). Para hacer algo en un montón de archivos que coinciden con un cierto patrón comodín, los globos de shell son suficientes.
Los editores suficientemente avanzados le permiten hacer esto desde adentro. Por ejemplo, en Emacs, simplemente use el comando de apertura de archivo normal ( C-x C-f
) e ingrese *.txt
.
Si también desea hacer coincidir archivos en subdirectorios, en zsh o bash ≥4, puede usar $EDITOR **/*.txt
.
Depende de algunos matices de su editor de texto. Los editores avanzados probablemente puedan manejar la apertura de múltiples archivos desde la línea de comando en una instancia. Pero digamos, por ejemplo, que su editor ($ EDITOR en mis ejemplos a continuación) solo puede abrir uno a la vez. Debe canalizar la salida de un apropiado find
en xargs
. Esto también depende de que $ EDITOR no se haga cargo del TTY (por lo tanto, usando uno gráfico)
find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR
Si desea utilizar un editor de consola, un bucle de shell podría ser más apropiado, pero fallará para muchos nombres de archivo poco comunes (al contraer o sustituir caracteres de espacio en blanco y otras cosas):
for i in *.c; do $EDITOR "$i"; done
for
caso fallará para muchos nombres de archivo, incluidos el colapso / cambio de caracteres de espacios en blanco.
for
caso funcionará con cada nombre de archivo (excepto posiblemente los nombres que comienzan con -
o +
con algunos editores; for i in ./*.c
eso lo solucionaría).
editor-command *.css
, etc.