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?
fuente
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?
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.
editor-command *.css
, etc.Para abrir todos los archivos llamados algo
.txt
(es decir*.txt
) en el directorio actual:donde
$EDITOR
es su editor favorito, por ejemplogedit *.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 dels
realmente no es mostrar una lista de archivos, aunque eso sucede cuando lo invoca en un directorio. Lo quels
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
.fuente
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
enxargs
. Esto también depende de que $ EDITOR no se haga cargo del TTY (por lo tanto, usando uno gráfico)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):
fuente
$EDITOR *.c
ofor 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).