¿Cómo abro todos los archivos que son el resultado de un comando ls?

10

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?

c0smikdebris
fuente

Respuestas:

12

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.

Caleb
fuente
44
¡No analices la salida de ls! Uso editor-command *.css, etc.
Gilles 'SO- deja de ser malvado'
@Gilles: Debidamente notado, gracias por señalar lo obvio que todos no pudimos ver. @ c0smikdebris Tenga en cuenta que simplemente reescribo completamente mi respuesta, incluido un caso, si no tiene una forma obvia de hacer coincidir qué archivos son texto solo por su nombre.
Caleb
$ () es lo que realmente estaba buscando. Debería haber mencionado que estoy usando ls como ejemplo aquí. +1 a ambas respuestas.
c0smikdebris 05 de
"mi editor favorito". No es necesario especificar, @Caleb, ya que está claro más o menos desde el comienzo de la respuesta, ¡jajaja! ¡El mejor editor de todos!
Enrico Maria De Angelis
4

Para abrir todos los archivos llamados algo .txt(es decir *.txt) en el directorio actual:

$EDITOR *.txt

donde $EDITORes su editor favorito, por ejemplo gedit *.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 de lsrealmente no es mostrar una lista de archivos, aunque eso sucede cuando lo invoca en un directorio. Lo que lses ú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.

Gilles 'SO- deja de ser malvado'
fuente
Eso es realmente específico del editor. No hay garantía de que todos los editores traten todos sus argumentos de línea de comandos gratuitos como archivos para abrir, ni admitan abrir más de un archivo a la vez.
jmtd
2

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 finden 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
jmtd
fuente
2
¡No analices la salida de ls! Use $EDITOR *.co for i in *.c; do $EDITOR "$i"; done.
Gilles 'SO- deja de ser malvado'
Buena captura - editado adecuadamente.
jmtd
Tenga en cuenta que el forcaso fallará para muchos nombres de archivo, incluidos el colapso / cambio de caracteres de espacios en blanco.
jmtd
Como está escrito ahora, el 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).
Gilles 'SO- deja de ser malvado'