come aprire più file con il programma predefinito dal terminale?


13

Ho provato ad aprire tutti i miei file .mp3 da una cartella usando xdg-open ma ho scoperto che ne apre solo uno! Quindi ho cercato un po 'ma non c'era una domanda del genere! Ho trovato "evince" ma a quanto pare apre file di testo e gnome-open apre anche un file.

Voglio aprire tutti i file dello stesso formato in una cartella dal terminale. Sono nuovo di Ubuntu, quindi ti preghiamo di spiegare un po 'di più.


1
xdg-opendovrebbe davvero essere in grado di farlo per impostazione predefinita ... basta passare l'elenco degli argomenti al programma. Forza gente su freedesktop.org! :-)
Ciro Santilli 20 病毒 审查 六四 事件 法轮功

Risposte:


8

Infatti. Puoi usare la shell per aggirare questo, in questo modo:

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

Oppure, se lo vuoi più robusto, prova

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

Il primo non funziona con i file con spazi bianchi nel loro nome e il secondo non funziona affatto ( find: paths must precede expression: -).
Sparhawk,

1
Se leggi attentamente, ho scritto "se lo vuoi più robusto ...", quindi la prima versione semplice non funziona con gli spazi, ma non era questa l'intenzione. La seconda soluzione funziona con Ubuntu; Cordiali saluti, le versioni più recenti di trovano predefinito il percorso a.
Agoston Horvath,

Non sono sicuro che la mancanza di percorso sia il problema nel secondo (nonostante il messaggio di errore). Ho provato a inserire .e ho ricevuto lo stesso messaggio di errore. In un'altra directory, ottengo xdg-open: unexpected argument './foo.mp3'con o senza ..
Sparhawk,

Inoltre, penso che avere spazi nei nomi non sia uno scenario così raro che dovrebbe essere ignorato, anche in casi "semplici".
Sparhawk,

Non ne so abbastanza sulla tua configurazione specifica da dire con certezza, ma xdg-open funziona come ho descritto in una nuova installazione di Ubuntu. Vedi man xdg-open se non sei sicuro.
Agoston Horvath,

4

Puoi provare:

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

ls *.mp3elencherà tutti i file mp3 dalla directory corrente, ognuno sulla propria riga, e l'output viene reindirizzato a un whileloop leggendo il contenuto di ciascuna riga e si aprirà quel contenuto (che in questo caso è il nome di un file mp3 ) nella sua applicazione predefinita.


@karel Ho aggiunto la -rbandiera. Penso che questo sia necessario per analizzare correttamente i file con un `\` nel loro nome.
Sparhawk,

2
umm ... non apriranno diverse istanze dello stesso programma?
Braiam,

@karel Sì ... anche il mio man readnon ha alcuna bandiera elencata! Non ricevo un errore nei miei test, ma probabilmente è perché l'ho creato aaae aa\a. In questo caso, xdg-opententa solo di aprire aaadue volte e non aa\a. (Va bene, sta diventando un po 'contorto, ma penso che il codice dovrebbe funzionare in tutte le situazioni. Forse findè un'opzione migliore, per evitare i limiti di lse read.) Inoltre, come può causare il caos esattamente? Non analizzerà solo l'output di ls?
Sparhawk,

@karel man readsi riferisce alla lettura della funzione C (sezione 2 dell'uomo). Questo readè un comando incorporato bash, quindi dovresti cercare man bashda qualche parte la riga 4632. @Sparhawk - grazie per la modifica.
Radu Rădeanu,

@Braiam umm ... questo non è il caso degli mp3 e dipende dalle impostazioni dell'applicazione predefinita. Il comportamento è lo stesso di quando apri più file da Nautilus o dal tuo file manager preferito.
Radu Rădeanu,

4

Ho scritto un piccolo script /usr/local/bin/o, anche se potresti semplicemente chiamarlo /usr/local/bin/xdg-opene sostituire il comando predefinito se lo desideri (supponendo che tu gli $PATHdia priorità). Inoltre, se non viene fornito alcun argomento, questo script aprirà invece la directory corrente.

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

Se non si desidera aprire la directory corrente senza argomenti, ciò mantiene il comportamento predefinito, ovvero mostra l'utilizzo.

#!/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 questo è agnostico sulla capacità del programma predefinito di analizzare più argomenti, ma chiamerà invece ogni comando una volta per ogni argomento. Non penso che ci sia un modo elegante per aggirare questo, dal momento che gli utenti potrebbero voler xdg-opendiversi tipi di file e alcuni comandi non accettano comunque più argomenti.


1

Ho scritto questo bashscript per coprire tutti i casi di utilizzo a cui potrei pensare:

#!/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

Caratteristiche:

  • Scrive l'output dell'errore in ~ / .xsession-errors anziché inquinare il terminale o gettarlo via
  • L'impostazione predefinita è l'apertura di un massimo di 10 file (per non sovraccaricare lo schermo / processore)
  • Puoi impostare un nuovo massimo con max=20 open $(ls -Q)
  • Consenti apertura di tutti i file, ad es all=1 open $(ls -Q)

0

Ecco un one-liner:

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

Poiché ho installato VLC (e come predefinito per gli mp3), questo apre tutti i file mp3 in una directory con VLC per me. Non si tratta di una sorta di "soluzione universale per risolvere tutti i problemi ", ma dovrebbe funzionare.

Spiegazione:

ls -AQpelenca "quasi tutti" i file, citando i nomi dei file e aggiungendo la barra ai nomi delle directory. Sostituisci -pcon --file-typese desideri escludere anche i link simbolici. Citando in caso di spazi nei nomi dei file.

grep "\.mp3\"$" seleziona solo i file che terminano con ".mp3" (più virgolette doppie).

xargs reindirizza l'intero lotto per programmare la restituzione della subshell successiva.

subshell:

xdg-mime query default audio/mpegfornisce il nome dell'app predefinito nel formato "app.desktop" per i file il cui mime è audio/mpeg. Puoi controllare il mimetype per qualsiasi file nel tuo ambiente con xdg-mime query filetype /path/to/file. Ho "audio / mpeg" per file mp3.

grep -oP '.+(?=\.desktop)' ottiene "app" da "app.desktop".

Se lo utilizzerai molto frequentemente in un sistema che non cambierà molto, potresti accorciarlo a questo:

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

Dove si sostituisce default_appcon il programma effettivo che si apre con i file. Puoi capire il suo nome con questo:

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


xdg-opennon funzionerà con questo problema, perché accetta solo un argomento di progettazione. Se si utilizza xargs -n1, si sta probabilmente colpendo il muro con il fatto che l'app in questione potrebbe aprire tutti i file in una nuova istanza, che potrebbe diventare brutta in più di un modo.


-1

Puoi usare questi comandi

cd /path/to/source_folder

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

solo se il tuo lettore musicale supporta più file come argomenti della riga di comando. Sostituisci vlccon il tuo lettore musicale preferito.

Questo funziona con RhythmBox e VLC nei miei test.


Non esegue find... -execsingoli comandi su ciascun file? Inoltre, se il tuo lettore musicale supporta più file come argomenti della riga di comando, potresti semplicemente usare vlc *.mp3.
Sparhawk,

@Sparhawk Non con \+alla fine
AB

@AB Ah sì, buon punto; Mi sbagliavo. Tuttavia, come per la mia seconda frase, sembra inutile usare findse hai intenzione di hardcode vlccomunque. (La domanda suggerisce che sono tutti in una directory.)
Sparhawk

Basta +, non è necessario \+.
Grumbel,

-1

Utilizzare questo comando per i file mp3 se si desidera aprire i file in VLC.

vlc /directory/*.mp3

Nota: utilizzare cvlcper utilizzare VLC senza interfaccia.


3
La domanda dice "programma predefinito", quindi usare VLC direttamente è un po '... inutile.
muru,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.