¿Cómo abrir varios archivos con el programa predeterminado desde la terminal?


13

Traté de abrir todos mis archivos .mp3 desde una carpeta usando, ¡ xdg-open pero descubrí que solo abre uno! ¡Así que busqué un poco pero no había tal pregunta! Encontré "evince" pero aparentemente abre archivos de texto y gnome-open también abre un archivo.

Quiero abrir todos los archivos del mismo formato en una carpeta desde el terminal. Soy nuevo en Ubuntu, así que explique un poco más.


1
xdg-openrealmente debería poder hacer esto por defecto ... solo pasa la lista de argumentos al programa. ¡Vamos gente de freedesktop.org! :-)
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Respuestas:


8

En efecto. Podrías usar shell para evitar esto, así:

ls -b *.mp3 | xargs -n 1 xdg-open

O, si lo quieres más robusto, prueba

find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open

El primero no funciona con archivos con espacios en blanco en su nombre, y el segundo no funciona en absoluto ( find: paths must precede expression: -).
Sparhawk

1
Si lees detenidamente, escribí "si quieres que sea más robusto ...", por lo tanto, la primera versión simple no funciona con espacios, pero esa no era la intención. La segunda solución funciona con ubuntu; Para su información, las versiones más nuevas de find predeterminan la ruta de acceso a
Agoston Horvath

No estoy seguro de que la falta de ruta sea el problema en el segundo (a pesar del mensaje de error). Intenté ponerlo .y recibí el mismo mensaje de error. En otro directorio, obtengo xdg-open: unexpected argument './foo.mp3'con o sin ..
Sparhawk

Además, creo que tener espacios en los nombres no es un escenario tan infrecuente que deba ignorarse, incluso en casos "simples".
Sparhawk

No sé lo suficiente sobre su configuración específica para decirlo con certeza, pero xdg-open funciona como lo describí en una nueva instalación de ubuntu. Vea man xdg-open si no está seguro.
Agoston Horvath

4

Puedes probar:

ls *.mp3 | while read -r file; do xdg-open "$file"; done

ls *.mp3listará todos los archivos mp3 del directorio actual, cada uno en su propia línea, y la salida se canalizará a un whilebucle que leerá el contenido de cada línea y abrirá ese contenido (que es el nombre de un archivo mp3 en este caso ) en su aplicación predeterminada.


@karel agregué la -rbandera. Creo que esto es necesario para analizar correctamente los archivos con un `\` en su nombre.
Sparhawk

2
umm ... ¿no abrirá esto varias instancias del mismo programa?
Braiam

@karel Sí ... ¡mi man readno tiene ninguna bandera en la lista, también! No obtengo un error en mis pruebas, pero probablemente sea porque creé aaay aa\a. En este caso, xdg-opensolo intenta abrir aaados veces, y no aa\a. (De acuerdo, se está volviendo un poco complicado, pero creo que el código debería funcionar para todas las situaciones. Quizás findsea ​​una mejor opción, para evitar las limitaciones de lsy read.) Además, ¿cómo puede causar estragos exactamente? ¿No solo va a analizar la salida de ls?
Sparhawk

@karel se man readestá refiriendo a la lectura de la función C (sección 2 del hombre). Este reades un comando bash incorporado, por lo que debe buscar en man bashalgún lugar en la línea 4632. @Sparhawk: gracias por editarlo.
Radu Rădeanu

@Braiam umm ... este no es el caso de los mp3 y depende de la configuración de la aplicación predeterminada. El comportamiento es el mismo que cuando abre varios archivos desde Nautilus o su administrador de archivos favorito.
Radu Rădeanu

4

Escribí un pequeño script /usr/local/bin/o, aunque podría llamarlo /usr/local/bin/xdg-openy reemplazar el comando predeterminado si lo desea (suponiendo que $PATHle dé prioridad). Además, si no se le da ningún argumento, este script abrirá el directorio actual.

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
  xdg-open . &> /dev/null
else
  for file in "$@"; do
    xdg-open "$file" &> /dev/null
  done
fi

Si no desea abrir el directorio actual sin argumentos, esto conserva el comportamiento predeterminado, es decir, muestra el uso.

#!/usr/bin/env bash
if [ $# -eq 0 ]; then
  xdg-open &> /dev/null
else
  for file in "$@"; do
    xdg-open "$file" &> /dev/null
  done
fi

NB esto es agnóstico acerca de la capacidad del programa predeterminado para analizar múltiples argumentos, pero en su lugar llamará a cada comando una vez por cada argumento. No creo que haya una forma elegante de evitar esto, ya que los usuarios pueden querer xdg-opendiferentes tipos de archivos, y algunos comandos no tomarán múltiples argumentos de todos modos.


1

Escribí este bashscript para cubrir todos los casos de uso que se me ocurrieron:

#!/bin/bash
set -euo pipefail; shopt -s failglob # bash strict mode

max=${max:-10} # Set default maximum if $max is not set
[[ ${all:-} ]] && max=$# # Set max to all files if $all is non-null

for file in "${@:1:$max}"; do
  xdg-open "$file"
done &>>~/.xsession-errors

caracteristicas:

  • Escribe la salida de error en ~ / .xsession-errors en lugar de contaminar el terminal o tirarlo
  • El valor predeterminado es abrir un máximo de 10 archivos (para no sobrecargar la pantalla / procesador)
  • Puede establecer un nuevo máximo con max=20 open $(ls -Q)
  • Permitir abrir todos los archivos, p. Ej. all=1 open $(ls -Q)

0

Aquí hay una frase:

ls -AQp | grep "\.mp3\"$" | xargs `xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)'`

Como tengo instalado VLC (y por defecto para mp3), esto abre todos los archivos mp3 en un directorio con VLC para mí. Este no es ningún tipo de " solución universal para resolverlo todo y trabajar en todos los casos ", pero debería funcionar.

Explicación:

ls -AQpenumera "casi todos" los archivos, citando los nombres de los archivos y agregando barras a los nombres de los directorios. Reemplace -pcon --file-typesi también desea excluir enlaces simbólicos. Cita en caso de espacios en los nombres de archivo.

grep "\.mp3\"$" selecciona solo archivos que terminan con ".mp3" (más comillas dobles).

xargs redirige todo el lote al programa que devuelve el siguiente subshell.

subshell:

xdg-mime query default audio/mpegda el nombre predeterminado de la aplicación en formato "app.desktop" para archivos cuyo mime es audio/mpeg. Puede verificar mimetype para cualquier archivo en su entorno con xdg-mime query filetype /path/to/file. Obtuve "audio / mpeg" para archivos mp3.

grep -oP '.+(?=\.desktop)' obtiene la "aplicación" de "app.desktop".

Si lo va a usar con mucha frecuencia en un sistema que no va a cambiar mucho, puede acortarlo a esto:

ls -AQp | grep "\.mp3\"$" | xargs default_app

Donde se reemplaza default_appcon el programa real que se abre con los archivos. Puede averiguar su nombre con esto:

xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)'


xdg-openNo funcionará con este problema, ya que solo acepta un argumento por diseño. Si lo usa xargs -n1, es probable que vaya a la pared con el hecho de que la aplicación resultante en cuestión podría abrir todos los archivos en una nueva instancia, lo que podría ponerse feo en más de una forma.


-1

Puedes usar estos comandos

cd /path/to/source_folder

find . -type f -name *.mp3 -exec vlc {} \+

solo si su reproductor de música admite varios archivos como argumentos de línea de comandos. Reemplace vlccon su reproductor de música de elección.

Esto funciona con RhythmBox y VLC en mis pruebas.


¿No find... -execejecuta comandos individuales en cada archivo? Y también, si su reproductor de música admite varios archivos como argumentos de línea de comandos, puede usarlos vlc *.mp3.
Sparhawk

@Sparhawk No con \+al final
AB

@AB Ah sí, buen punto; Estaba equivocado. Sin embargo, según mi segunda oración, parece inútil usar findsi vas a codificar de vlctodos modos. (La pregunta sugiere que todos están en un directorio)
Sparhawk

Solo +es suficiente, no es necesario \+.
Grumbel

-1

Use este comando para archivos mp3 si desea abrir archivos en VLC.

vlc /directory/*.mp3

Nota: Use cvlcpara usar VLC sin interfaz.


3
La pregunta dice "programa predeterminado", por lo que usar VLC directamente es un poco ... inútil.
muru
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.