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 , lses 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 filele 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 xargso foren 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
$EDITORes su editor favorito, por ejemplogedit *.txt,nano *.txt,vim *.txt,emacs *.txto lo que sea. Use solo*para hacer coincidir todos los archivos en el directorio actual.Tenga en cuenta que el
lscomando no está involucrado. El trabajo delsrealmente no es mostrar una lista de archivos, aunque eso sucede cuando lo invoca en un directorio. Lo quelses ú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
findenxargs. 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 *.cofor i in *.c; do $EDITOR "$i"; done.forcaso fallará para muchos nombres de archivo, incluidos el colapso / cambio de caracteres de espacios en blanco.forcaso funcionará con cada nombre de archivo (excepto posiblemente los nombres que comienzan con-o+con algunos editores;for i in ./*.ceso lo solucionaría).