como abrir vários arquivos com o programa padrão do terminal?

13

Tentei abrir todos os meus arquivos .mp3 de uma pasta usando, xdg-open mas descobri que ele abre apenas um! Então eu procurei um pouco, mas não havia essa pergunta! Eu encontrei "evince", mas aparentemente ele abre arquivos de texto e o gnome-open também abre um arquivo.

Quero abrir todos os arquivos do mesmo formato em uma pasta do terminal. Eu sou novo no Ubuntu, então explique um pouco mais.

karo
fonte
1
xdg-openrealmente deve ser capaz de fazer isso por padrão ... basta passar a lista de argumentos para o programa. Vamos lá pessoal do freedesktop.org! :-)
Ciro Santilli escreveu

Respostas:

8

De fato. Você pode usar o shell para contornar isso, assim:

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

Ou, se você quiser mais robusto, tente

find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open
Agoston Horvath
fonte
O primeiro não funciona com arquivos com espaço em branco no nome e o segundo não funciona ( find: paths must precede expression: -).
Sparhawk
1
Se você leu com atenção, escrevi "se você quiser mais robusto ...", portanto, a primeira versão simples não funciona com espaços, mas essa não era a intenção. A segunda solução funciona com o ubuntu; Para sua informação, versões mais recentes de encontrar o nome do caminho padrão.
Agoston Horvath
Não tenho certeza de que a falta de caminho seja o problema no segundo (apesar da mensagem de erro). Tentei colocar .e recebi a mesma mensagem de erro. Em outro diretório, recebo xdg-open: unexpected argument './foo.mp3'com ou sem ..
Sparhawk
Além disso, acho que ter espaços em nomes não é um cenário tão incomum que deve ser desconsiderado, mesmo em casos "simples".
Sparhawk
Não sei o suficiente sobre sua configuração específica para ter certeza, mas o xdg-open funciona como descrevi em uma nova instalação do ubuntu. Veja man xdg-open se não tiver certeza.
Agoston Horvath 27/10/2013
4

Podes tentar:

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

ls *.mp3listará todos os arquivos mp3 do diretório atual, cada um em sua própria linha, e a saída será canalizada para um whileloop, que lerá o conteúdo de cada linha e abrirá esse conteúdo (que é o nome de um arquivo mp3 nesse caso) ) em seu aplicativo padrão.

Radu Rădeanu
fonte
@karel eu adicionei a -rbandeira. Eu acho que é necessário analisar corretamente os arquivos com um `\` em seu nome.
Sparhawk
2
umm ... isso não abre várias instâncias do mesmo programa?
Braiam
@karel Yeah ... my man readtambém não tem nenhuma bandeira listada! Não recebo um erro nos meus testes, mas é provavelmente porque eu criei aaae aa\a. Nesse caso, xdg-openapenas tenta abrir aaaduas vezes, e não aa\a. (Ok, está ficando um pouco complicado, mas acho que o código deve funcionar para todas as situações. Talvez findseja uma opção melhor, para evitar as limitações de lse read.) Além disso, como ele pode causar estragos exatamente? Não será apenas analisar a saída de ls?
Sparhawk
@karel man readestá se referindo à função C lida (seção 2 do manual). Este readé um comando interno do bash, então você deve procurar em man bashalgum lugar na linha 4632. @Sparhawk - obrigado pela edição.
Radu Rădeanu 26/10
@Braiam umm ... este não é o caso dos mp3 e depende das configurações do aplicativo padrão. O comportamento é o mesmo de quando você abre vários arquivos do Nautilus ou seu gerenciador de arquivos favorito.
Radu Rădeanu 26/10
4

Escrevi um pequeno script /usr/local/bin/o, embora você possa chamá-lo /usr/local/bin/xdg-opene substituir o comando padrão, se desejar (assumindo que o seu $PATHé prioritário). Além disso, se não houver argumento, esse script abrirá o diretório atual.

#!/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 você não deseja abrir o diretório atual sem argumentos, isso mantém o comportamento padrão, ou seja, mostra o 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

Nota: isso é independente da capacidade do programa padrão de analisar vários argumentos, mas, em vez disso, chamará cada comando uma vez para cada argumento. Eu não acho que exista uma maneira elegante de contornar isso, pois os usuários podem querer xdg-opendiferentes tipos de arquivos, e alguns comandos não terão vários argumentos de qualquer maneira.

Sparhawk
fonte
1

Eu escrevi este bashscript para cobrir todos os casos de uso em que pude pensar:

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

Recursos:

  • Grava a saída de erro em ~ / .xsession-errors em vez de poluir o terminal ou jogá-lo fora
  • O padrão é abrir um máximo de 10 arquivos (para não sobrecarregar a tela / processador)
  • Pode definir um novo máximo com max=20 open $(ls -Q)
  • Permite abrir todos os arquivos, por exemplo all=1 open $(ls -Q)
Tom Hale
fonte
0

Aqui está uma frase:

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

Como eu tenho o VLC instalado (e como padrão para mp3s), isso abre todos os arquivos mp3 em um diretório com VLC para mim. Este não é nenhum tipo de " solução universal para resolver tudo e trabalhar em todos os casos ", mas deve funcionar.

Explicação:

ls -AQplista "quase todos" os arquivos, citando nomes de arquivos e acrescentando barras aos nomes dos diretórios. Substitua -ppor --file-typese desejar excluir links simbólicos também. Citação em caso de espaços nos nomes de arquivos.

grep "\.mp3\"$" seleciona apenas os arquivos que terminam com ".mp3" (além de aspas duplas).

xargs redireciona todo o lote para programar o retorno do subshell seguinte.

subshell:

xdg-mime query default audio/mpegfornece o nome padrão do aplicativo no formato "app.desktop" para arquivos cuja mímica é audio/mpeg. Você pode verificar o tipo MIMET para qualquer arquivo em seu ambiente com xdg-mime query filetype /path/to/file. Eu tenho "audio / mpeg" para arquivo mp3.

grep -oP '.+(?=\.desktop)' obtém o "app" de "app.desktop".

Se você for usá-lo com muita frequência em um sistema que não vai mudar muito, convém abreviá-lo para isso:

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

Onde você substitui default_apppelo programa real que é aberto com os arquivos. Você pode descobrir seu nome com isso:

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


xdg-opennão funcionará com esse problema, porque ele aceita apenas um argumento por design. Se estiver usando xargs -n1, é provável que você atinja o muro com a possibilidade de o aplicativo resultante em questão abrir todos os arquivos em uma nova instância, que pode ficar feia em mais de uma maneira.

F-3000
fonte
-1

Você pode usar esses comandos

cd /path/to/source_folder

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

somente se o seu music player suportar vários arquivos como argumentos de linha de comando. Substitua vlcpelo seu music player de sua escolha.

Isso funciona com o RhythmBox e o VLC nos meus testes.

kiri
fonte
Não find... -execexecuta comandos individuais em cada arquivo? E também, se o seu music player suportar vários arquivos como argumentos de linha de comando, você pode simplesmente usar vlc *.mp3.
Sparhawk
@Sparhawk Não com \+no final
AB
@ Ah Ah sim, bom ponto; Eu estava errado. No entanto, de acordo com a minha segunda frase, parece inútil usar findse você for codificar de vlcqualquer maneira. (A pergunta sugere que eles estão todos em um diretório.)
Sparhawk
Apenas +é suficiente, não há necessidade \+.
Grumbel
-1

Use este comando para arquivos mp3 se desejar abrir arquivos no VLC.

vlc /directory/*.mp3

Nota: Use cvlcpara usar o VLC sem interface.

karo
fonte
3
A pergunta diz "programa padrão", então usar o VLC diretamente é um pouco ... inútil.
muru 28/09/14