De fato. Você poderia 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
Eu 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, abrir arquivos de texto e o gnome-open também abre um arquivo.
Eu quero abrir todos os arquivos do mesmo formato em uma pasta do terminal. Eu sou novo no Ubuntu, então, por favor, explique um pouco mais.
De fato. Você poderia 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
Você pode tentar:
ls *.mp3 | while read -r file; do xdg-open "$file"; done
ls *.mp3
listará todos os arquivos mp3 do diretório atual, cada um em sua própria linha, e a saída será canalizada para um loop while
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.
Eu escrevi um pequeno script /usr/local/bin/o
, embora você pudesse chamá-lo de /usr/local/bin/xdg-open
e substituir o comando padrão se quisesse (assumindo que seu $PATH
dá prioridade). Além disso, se não houver argumentos, 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 quiser abrir o diretório atual sem argumento, 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
N.B. isso é agnóstico sobre a 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 haja uma maneira elegante de contornar isso, já que os usuários podem querer xdg-open
tipos diferentes de arquivos, e alguns comandos não aceitarão vários argumentos de qualquer maneira.
Aqui está um verso:
ls -AQp | grep "\.mp3\"$" | xargs 'xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)''
Como eu tenho VLC instalado (e como padrão para mp3s), isso abre todos os arquivos mp3 em um diretório com o VLC para mim. Isso não é qualquer tipo de " universal-resolver-tudo-e-trabalhar-em-todo-caso-em-maldito ", mas deve funcionar.
Explicação:
ls -AQp
lista "quase todos os arquivos", citando nomes de arquivos e acrescentando barra a nomes de diretórios. Substitua -p
por --file-type
se desejar excluir também os links simbólicos. Citando no caso de espaços em nomes de arquivos.
grep "\.mp3\"$"
seleciona apenas arquivos que terminam com ".mp3" (mais aspas duplas).
xargs
redireciona todo o lote para programar depois dos retornos de subshell.
subshell:
xdg-mime query default audio/mpeg
fornece o nome do aplicativo padrão no formato "app.desktop" para arquivos cujo mime é audio/mpeg
. Você pode verificar o tipo MIME para qualquer arquivo em seu ambiente com xdg-mime query filetype /path/to/file
. Eu tenho "audio / mpeg" para mp3-arquivo.
grep -oP '.+(?=\.desktop)'
obtém o "aplicativo" de "app.desktop".
Se você for usá-lo com muita frequência em um sistema que não mudará muito, convém encurtá-lo para isso:
ls -AQp | grep "\.mp3\"$" | xargs default_app
Onde você substitui default_app
pelo programa real que é aberto com os arquivos. Você pode descobrir seu nome com isso:
xdg-mime query default audio/mpeg | grep -oP '.+(?=\.desktop)'
xdg-open
não funcionará com esse problema, porque aceita apenas um argumento por design. Se você estiver usando xargs -n1
, provavelmente você está indo para a parede com o fato de que o aplicativo resultante em questão pode abrir todos os arquivos em uma nova instância, que pode ficar feia de mais de uma maneira.
Eu escrevi este script bash
para cobrir todos os casos de uso em que eu conseguia 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:
max=20 open $(ls -Q)
all=1 open $(ls -Q)
Você pode usar esses comandos
cd /path/to/source_folder
find . -type f -name *.mp3 -exec vlc {} \+
somente se o seu tocador de música suportar vários arquivos como argumentos de linha de comando. Substitua vlc
pelo seu player de música de sua preferência.
Isso funciona com RhythmBox e VLC nos meus testes.
Use este comando para arquivos mp3 se você quiser abrir arquivos no VLC.
vlc /directory/*.mp3
Nota: use cvlc
para usar o VLC sem interface.
Tags xdg-open