cara membuka banyak file dengan program default dari terminal?

13

Saya mencoba untuk membuka semua file .mp3 saya dari folder menggunakan xdg-open tetapi saya menemukan itu membuka hanya satu! Jadi saya mencari sedikit tetapi tidak ada pertanyaan seperti itu! Saya menemukan "evince" tetapi ternyata itu membuka file teks dan gnome-open juga membuka satu file.

Saya ingin membuka semua file dengan format yang sama di folder dari terminal. Saya baru di Ubuntu, jadi tolong jelaskan sedikit lebih banyak.

karo
sumber
1
xdg-openharus benar-benar dapat melakukan ini secara default ... hanya meneruskan daftar argumen ke program. Ayo orang-orang freedesktop.org! :-)
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

8

Memang. Anda bisa menggunakan shell untuk mengatasi ini, seperti ini:

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

Atau, jika Anda menginginkannya lebih kuat, cobalah

find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open
Agoston Horvath
sumber
Yang pertama tidak bekerja dengan file dengan spasi putih di namanya, dan yang kedua tidak berfungsi sama sekali ( find: paths must precede expression: -).
Sparhawk
1
Jika Anda membaca dengan seksama, saya menulis "jika Anda menginginkannya lebih kuat ...", maka versi pertama dan sederhana tidak bekerja dengan spasi, tapi itu bukan maksudnya. Solusi kedua tidak bekerja dengan ubuntu; FYI, versi yang lebih baru dari menemukan default pathname.
Agoston Horvath
Saya tidak yakin bahwa kurangnya jalur adalah masalah di detik (meskipun pesan kesalahan). Saya mencoba memasukkan .dan mendapatkan pesan kesalahan yang sama. Di direktori lain, saya dapat xdg-open: unexpected argument './foo.mp3'dengan atau tanpa ..
Sparhawk
Juga, saya pikir memiliki spasi dalam nama-nama bukanlah skenario yang tidak biasa sehingga harus diabaikan, bahkan dalam kasus "sederhana".
Sparhawk
Saya tidak cukup tahu tentang pengaturan spesifik Anda untuk mengatakan dengan pasti, tetapi xdg-open berfungsi seperti yang saya jelaskan pada instalasi ubuntu baru. Lihat man xdg-open jika tidak yakin.
Agoston Horvath
4

Anda dapat mencoba:

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

ls *.mp3wil daftar semua file mp3 dari direktori saat ini, masing-masing pada baris sendiri, dan output disalurkan ke whileloop witch membaca konten setiap baris dan itu akan membuka konten itu (yang merupakan nama file mp3 dalam kasus ini ) dalam aplikasi standarnya.

Radu Rădeanu
sumber
@karel saya menambahkan -rbenderanya. Saya pikir ini perlu untuk mem-parsing file dengan benar dengan nama `\`.
Sparhawk
2
umm ... tidakkah ini membuka beberapa instance dari program yang sama?
Braiam
@karel Ya ... man readbendera saya tidak terdaftar sama sekali! Saya tidak mendapatkan kesalahan dalam pengujian saya, tapi itu mungkin karena saya buat aaadan aa\a. Dalam hal ini, xdg-opencoba buka aaadua kali saja, dan tidak aa\a. (Oke, ini jadi sedikit berbelit-belit, tapi saya pikir kode harus bekerja untuk semua situasi. Mungkin findmerupakan pilihan yang lebih baik, untuk menghindari batasan lsdan read.) Juga, bagaimana bisa membuat kerusakan persis? Bukankah itu hanya akan mem-parsing output ls?
Sparhawk
@karel merujuk man readke membaca fungsi C (bagian 2 dari pria itu). Ini readadalah perintah bash builtin, jadi Anda harus mencari di man bashsuatu tempat di baris 4632. @Sparhawk - terima kasih telah mengedit.
Radu Rădeanu
@Braiam umm ... ini bukan kasus untuk mp3 dan tergantung pada pengaturan dari aplikasi default. Perilaku ini sama seperti ketika Anda membuka banyak file dari Nautilus atau manajer file favorit Anda.
Radu Rădeanu
4

Saya menulis sebuah skrip kecil /usr/local/bin/o, meskipun Anda bisa memanggilnya /usr/local/bin/xdg-opendan mengganti perintah default jika Anda mau (dengan asumsi Anda $PATHmemprioritaskannya). Juga, jika tidak diberikan argumen, skrip ini akan membuka direktori saat ini.

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

Jika Anda tidak ingin membuka direktori saat ini tanpa argumen, ini mempertahankan perilaku default, yaitu menunjukkan penggunaan.

#!/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 ini agnostik tentang kemampuan program default untuk mem-parsing beberapa argumen, tetapi sebaliknya akan memanggil setiap perintah satu kali untuk setiap argumen. Saya tidak berpikir ada cara yang elegan di sekitar ini, karena pengguna mungkin ingin xdg-openberbagai jenis file, dan beberapa perintah tidak akan mengambil banyak argumen.

Sparhawk
sumber
1

Saya menulis bashskrip ini untuk mencakup semua kasus penggunaan yang dapat saya pikirkan:

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

Fitur:

  • Menulis output kesalahan ke ~ / .xsession-error daripada mencemari terminal atau membuangnya
  • Default untuk membuka maksimal 10 file (untuk tidak membebani layar / prosesor)
  • Dapat mengatur maksimum baru dengan max=20 open $(ls -Q)
  • Izinkan membuka semua file, mis all=1 open $(ls -Q)
Tom Hale
sumber
0

Berikut ini adalah one-liner:

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

Karena saya telah menginstal VLC (dan sebagai default untuk mp3), ini membuka semua file mp3 dalam direktori dengan VLC untuk saya. Ini bukan semacam " universal-menyelesaikan-itu-semua-dan-bekerja-dalam-setiap-freaking-case ", tetapi harus bekerja.

Penjelasan:

ls -AQpdaftar "hampir semua" file, mengutip nama file dan menambahkan slash ke nama direktori. Ganti -pdengan --file-typejika Anda ingin mengecualikan symlink juga. Mengutip jika ada spasi dalam nama file.

grep "\.mp3\"$" hanya memilih file yang diakhiri dengan ".mp3" (ditambah kutipan ganda).

xargs mengalihkan seluruh lot ke program yang mengikuti pengembalian subkulit.

subkulit:

xdg-mime query default audio/mpegmemberi nama aplikasi default dalam format "app.desktop" untuk file yang pantomimnya audio/mpeg. Anda dapat memeriksa mimetype untuk file apa pun di lingkungan Anda xdg-mime query filetype /path/to/file. Saya mendapat "audio / mpeg" untuk file mp3.

grep -oP '.+(?=\.desktop)' mendapat "aplikasi" dari "app.desktop".

Jika Anda akan menggunakannya sangat sering dalam sistem yang tidak akan banyak berubah, Anda mungkin ingin mempersingkatnya menjadi ini:

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

Di mana Anda mengganti default_appdengan program aktual yang terbuka dengan file. Anda dapat mengetahui namanya dengan ini:

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


xdg-opentidak akan bekerja dengan masalah ini, karena hanya menerima satu argumen dengan desain. Jika menggunakan xargs -n1, Anda mungkin akan menabrak dinding dengan bahwa aplikasi yang dihasilkan tersebut dapat membuka setiap file dalam contoh baru, yang mungkin jelek di lebih dari satu cara.

F-3000
sumber
-1

Anda dapat menggunakan perintah ini

cd /path/to/source_folder

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

hanya jika pemutar musik Anda mendukung banyak file sebagai argumen baris perintah. Ganti vlcdengan pemutar musik pilihan Anda.

Ini berfungsi dengan RhythmBox dan VLC dalam pengujian saya.

kiri
sumber
Tidak find... -execmenjalankan perintah individual pada setiap file? Dan juga, jika pemutar musik Anda mendukung banyak file sebagai argumen baris perintah, Anda bisa menggunakannya vlc *.mp3.
Sparhawk
@Sparhawk Tidak dengan \+di akhir
AB
@ AB Ah ya, poin bagus; Saya salah. Namun, sesuai kalimat kedua saya, sepertinya tidak ada gunanya untuk digunakan findjika Anda akan vlctetap menggunakan hardcode . (Pertanyaannya menunjukkan mereka semua dalam satu direktori.)
Sparhawk
Cukup +sudah, tidak perlu \+.
Grumbel
-1

Gunakan perintah ini untuk file mp3 jika Anda ingin membuka file di VLC.

vlc /directory/*.mp3

Catatan: Gunakan cvlcuntuk menggunakan VLC tanpa antarmuka.

karo
sumber
3
Pertanyaannya mengatakan "program default", jadi menggunakan VLC secara langsung sedikit ... sia-sia.
muru