terminalden varsayılan program ile birden fazla dosya nasıl açılır?


13

Kullanarak bir klasörden tüm .mp3 dosyaları açmaya çalıştım xdg-open ama sadece bir tane açtığını öğrendim! Bu yüzden biraz aradım ama böyle bir soru yoktu! "Evince" buldum ama görünüşe göre metin dosyalarını açın ve gnome-open da bir dosya açar.

Aynı formattaki tüm dosyaları terminalden bir klasörde açmak istiyorum. Ubuntu'da yeniyim, bu yüzden lütfen biraz daha açıklayın.


1
xdg-openbunu gerçekten varsayılan olarak yapabilmelidir ... sadece argüman listesini programa iletmeniz yeterlidir. Haydi freedesktop.org insanı! :-)
Ciro Santilli 法轮功 病毒 审查 六四 事件 法轮功

Yanıtlar:


9

Aslında. Bu sorunu çözmek için kabuk kullanabilirsiniz:

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

Veya daha sağlam olmasını istiyorsanız,

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

Birincisi, adında boşluk bulunan dosyalarla çalışmaz ve ikincisi hiç çalışmaz ( find: paths must precede expression: -).
Sparhawk

1
Dikkatlice okursanız, "daha sağlam olmasını istiyorsanız ..." yazdım, bu nedenle ilk, basit sürüm gerçekten boşluklarla çalışmaz, ama niyet bu değildi. İkinci çözüm ubuntu ile çalışır; Bilginize, yeni sürümler varsayılan olarak yol adını bulur.
Agoston Horvath

(Hata iletisine rağmen) yol eksikliği ikinci sorun olduğundan emin değilim. Takmayı denedim .ve aynı hata mesajını aldım. Başka bir dizinde olsun xdg-open: unexpected argument './foo.mp3'ya da olmasın ..
Sparhawk

Ayrıca, adlarda boşluklara sahip olmanın "basit" durumlarda bile göz ardı edilmesi gereken bir senaryo olmadığını düşünüyorum.
Sparhawk

Özel kurulumunuz hakkında kesin olarak söyleyecek kadar bilgim yok ama xdg-open yeni bir ubuntu kurulumunda tarif ettiğim gibi çalışıyor. Emin değilseniz bkz. Xdg-open man.
Agoston Horvath

4

Deneyebilirsin:

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

ls *.mp3geçerli dizindeki tüm mp3 dosyalarını listeleyecek, her biri kendi satırında olacak ve çıktı whileher satırın içeriğini okuyan bir döngü cadıya yönlendirilecek ve bu içeriği açacaktır (bu durumda bir mp3 dosyasının adıdır) ) varsayılan uygulamasında.


@karel -rBayrağı ekledim . Bence bu dosyaları dosya adlarında doğru şekilde ayrıştırmak için gerekli.
Sparhawk

2
umm ... bu aynı programın birkaç örneğini açmayacak mı?
Braiam

@karel Evet… Listemde man readhiç bayrak yok! Testlerimde hata almıyorum, ancak bunun nedeni büyük olasılıkla aaave aa\a. Bu durumda, xdg-opensadece aaaiki kez açmaya çalışır , değil aa\a. (Tamam, biraz dolambaçlı gidiyor, ama ben kodu tüm durumlar için çalışması gerektiğini düşünüyorum. Belki finddaha iyi bir seçenektir, sınırlamalarını önlemek lsve read.) Ayrıca, tam olarak nasıl hasara yol açabilir? Sadece çıktısını ayrıştıracak lsmı?
Sparhawk

@karel man readokunan C fonksiyonuna başvuruyor (insanın 2. bölümü). Bu readbir bash yerleşik komutudur, bu nedenle man bash4632 satırında bir yere bakmalısınız. @Sparhawk - edititng için teşekkürler.
Radu Rădeanu

@Braiam umm ... bu mp3'ler için geçerli değildir ve varsayılan uygulamadaki ayarlara bağlıdır. Davranış, Nautilus veya favori dosya yöneticinizden birden fazla dosya açtığınızda olduğu gibi aynıdır.
Radu Rădeanu

4

Ben /usr/local/bin/osadece küçük bir komut dosyası yazdım , ancak sadece isterseniz /usr/local/bin/xdg-openve varsayılan komutu değiştirmek olabilir (sizin $PATHönceliğinizi varsayarak ). Ayrıca, herhangi bir bağımsız değişken verilmezse, bu komut dosyası geçerli dizini açar.

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

Geçerli dizini bağımsız değişken olmadan açmak istemiyorsanız, bu varsayılan davranışı korur, yani kullanımı gösterir.

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

Not: Bu, varsayılan programın birden çok argümanı ayrıştırma yeteneği konusunda agnostiktir, ancak bunun yerine her bir argüman için her komutu bir kez çağırır. Bunun etrafında zarif bir yol olduğunu düşünmüyorum, çünkü kullanıcılar xdg-openfarklı dosya türlerini isteyebilir ve bazı komutlar yine de birden fazla argüman almayacaktır.


1

Bu bashkomut dosyasını, düşünebileceğim tüm kullanım durumlarını kapsayacak şekilde yazdım :

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

Özellikleri:

  • Terminali kirletmek veya atmak yerine hata çıkışını ~ / .xsession-error olarak yazar
  • Varsayılan olarak en fazla 10 dosya açma (ekranı / işlemciyi aşırı yüklememe)
  • İle yeni bir maksimum belirleyebilir max=20 open $(ls -Q)
  • Tüm dosyaların açılmasına izin ver, ör. all=1 open $(ls -Q)

0

İşte bir astar:

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

VLC'yi yüklediğimden (ve mp3'ler için varsayılan olarak), bu benim için VLC bulunan bir dizindeki tüm mp3 dosyalarını açar. Bu, "herhangi bir tür değildir , evrensel-çözmek-it-all-ve-iş-in-her-durum heyecanlanıyorum ", ancak gerektiği çalışır.

Açıklama:

ls -AQp"hemen hemen tüm" dosyaları listeler, dosya adlarını gösterir ve dizin adlarına eğik çizgi ekler. Simge bağlantılarını da hariç tutmak istiyorsanız -pile değiştirin --file-type. Dosya adlarında boşluk olması durumunda alıntı yapma.

grep "\.mp3\"$" yalnızca ".mp3" ile biten dosyaları (artı çift tırnak işareti) seçer.

xargs tüm alt kabuğu aşağıdaki alt kabuk döndürme programlamak için yeniden yönlendirir.

altkabuk:

xdg-mime query default audio/mpegmime olan dosyalar için "app.desktop" biçiminde varsayılan uygulamanın adını verir audio/mpeg. Mimetype ile ortamınızdaki herhangi bir dosyayı kontrol edebilirsiniz xdg-mime query filetype /path/to/file. Mp3 dosyası için "ses / mpeg" var.

grep -oP '.+(?=\.desktop)' "app" dan "app.desktop" alır.

Çok fazla değişmeyecek bir sistemde çok sık kullanacaksanız, bunu kısaltmak isteyebilirsiniz:

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

default_appDosyalarla açılan gerçek programla değiştirdiğiniz yer . Bununla adını anlayabilirsiniz:

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


xdg-opentasarım ile sadece bir argümanı kabul ettiği için bu problemle çalışmaz. Kullanıyorsanız xargs -n1, söz konusu sonuçtaki uygulamanın her dosyayı yeni bir durumda açabileceği ve birden fazla şekilde çirkin olabileceği için duvara çarpıyorsunuz.


-1

Bu komutları kullanabilirsiniz

cd /path/to/source_folder

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

yalnızca müzik çalarınız komut satırı bağımsız değişkenleri olarak birden fazla dosyayı destekliyorsa. vlcİstediğiniz müzik çalarınızla değiştirin .

Bu benim test RhythmBox ve VLC ile çalışır.


Does not find... -execher dosya üzerinde tek tek komutları çalıştırın? Ayrıca, müzik çalarınız komut satırı bağımsız değişkenleri olarak birden fazla dosyayı destekliyorsa, kullanabilirsiniz vlc *.mp3.
Sparhawk

@Sparhawk Değil ile \+sonunda
AB

@AB Ah evet, iyi bir nokta; Ben hatalıydım. Ancak, ikinci cümle göre, yine de findsabit kod kullanacaksanız kullanmak anlamsız görünüyor vlc. (Soru, hepsinin bir dizinde olduğunu gösteriyor.)
Sparhawk

Sadece +yeter, gerek yok \+.
Grumbel

-1

VLC'de dosya açmak istiyorsanız mp3 dosyaları için bu komutu kullanın.

vlc /directory/*.mp3

Not: cvlcArabirim olmadan VLC kullanmak için kullanın.


3
Soru "varsayılan program" diyor, bu yüzden doğrudan VLC kullanmak biraz ... anlamsız.
muru
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.