टर्मिनल से डिफ़ॉल्ट प्रोग्राम के साथ कई फाइलें कैसे खोलें?


13

मैंने अपने सभी .mp3 फाइलों को एक फ़ोल्डर से खोलने की कोशिश की, xdg-open लेकिन मुझे पता चला कि यह सिर्फ एक ही खुलता है! इसलिए मैंने थोड़ी खोज की लेकिन ऐसा कोई सवाल नहीं था! मुझे "ईवसन" मिला, लेकिन जाहिर तौर पर यह टेक्स्ट फाइल खोलती है और गनोम-ओपन भी एक फाइल खोलता है।

मैं टर्मिनल से एक फ़ोल्डर में एक ही प्रारूप की सभी फाइलें खोलना चाहता हूं। मैं उबंटू में नया हूं इसलिए कृपया थोड़ा और समझाएं।


1
xdg-openवास्तव में डिफ़ॉल्ट रूप से ऐसा करने में सक्षम होना चाहिए ... बस तर्क सूची को कार्यक्रम में पास करें। Freedesktop.org पर आएं लोग! :-)
सिरो सेंटिल्ली ill 病毒 ill ill 法轮功 '

जवाबों:


8

वास्तव में। आप इस तरह से प्राप्त करने के लिए शेल का उपयोग कर सकते हैं:

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

या, यदि आप इसे और अधिक मजबूत चाहते हैं, तो प्रयास करें

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

पहला उनके नाम की व्हाट्सएप वाली फाइलों के साथ काम नहीं करता है, और दूसरा काम नहीं करता है ( find: paths must precede expression: -)।
स्पार्कहॉक

1
यदि आप ध्यान से पढ़ते हैं, तो मैंने लिखा है "यदि आप इसे और अधिक मजबूत चाहते हैं ...", इसलिए पहला, सरल संस्करण वास्तव में रिक्त स्थान के साथ काम नहीं करता है, लेकिन यह इरादा नहीं था। दूसरा समाधान ubuntu के साथ काम करता है; FYI करें, डिफ़ॉल्ट के नए संस्करण पथनाम के लिए तयशुदा हैं।
अगस्तन होरवाथ

मुझे यकीन नहीं है कि पथ की कमी दूसरे में समस्या है (त्रुटि संदेश के बावजूद)। मैंने डालने की कोशिश की .और वही त्रुटि संदेश मिला। एक और निर्देशिका में, मैं xdg-open: unexpected argument './foo.mp3'या उसके साथ मिलता हूं .
२१:३३ पर स्पार्हव

इसके अलावा, मुझे लगता है कि नामों में रिक्त स्थान होना इतना असामान्य नहीं है कि इसे "साधारण" मामलों में भी अवहेलना किया जाए।
Sparhawk

मैं निश्चित रूप से कहने के लिए आपके विशिष्ट सेटअप के बारे में पर्याप्त नहीं जानता, लेकिन xdg-open काम करता है जैसा कि मैंने एक नए ubuntu इंस्टॉल पर बताया है। अगर अनिश्चित है तो आदमी को देखें
अगस्टोन होर्वाथ

4

तुम कोशिश कर सकते हो:

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

ls *.mp3wil सूची सभी डाइरेक्टरी डायरेक्टरी की सभी mp3 फाइल्स को, हर एक की अपनी लाइन पर, और आउटपुट को whileलूप विच में डाला जाता है, प्रत्येक लाइन के कंटेंट को पढ़ता है और यह उस कंटेंट को खोलेगा (जो इस मामले में एक mp3 फाइल का नाम है। ) इसके डिफ़ॉल्ट अनुप्रयोग में।


@ कारेल I ने -rध्वज जोड़ा । मुझे लगता है कि उनके नाम में एक `\ 'के साथ फ़ाइलों को सही ढंग से पार्स करना आवश्यक है।
स्पार्कहॉक

2
उम ... यह एक ही कार्यक्रम के कई उदाहरण खोलना नहीं होगा?
Braiam

@ कारेल हाँ ... मेरे man readपास कोई भी ध्वज नहीं है, जो सभी पर सूचीबद्ध हों! मुझे अपने परीक्षण में कोई त्रुटि नहीं मिली, लेकिन ऐसा शायद इसलिए है क्योंकि मैंने बनाया aaaऔर aa\a। इस मामले में, xdg-openबस aaaदो बार खोलने की कोशिश करता है , और नहीं aa\a। (ठीक है, यह थोड़ा घुमावदार हो रही है, लेकिन मुझे लगता है कि कोड सभी स्थितियों के लिए काम करना चाहिए। शायद findएक बेहतर विकल्प है, की सीमाओं से बचने के लिए lsऔर read।) इसके अलावा, कैसे यह वास्तव में कहर बरपाने कर सकते हैं? क्या यह केवल आउटपुट को पार्स करने वाला नहीं है ls?
स्पार्कहॉक

@ कारेल man readसी फंक्शन (आदमी का सेक्शन 2) पढ़ रहे हैं। यह readएक बैश बिलियन कमांड है, इसलिए आपको man bashकहीं पर लाइन 4632 में दिखना चाहिए । @Sparhawk - edititng के लिए धन्यवाद।
रादु राईडेनु

@Braiam umm ... यह एमपी 3 के लिए मामला नहीं है और डिफ़ॉल्ट एप्लिकेशन से सेटिंग्स के बारे में निर्भर करता है। व्यवहार वैसा ही है, जब आप Nautilus या अपने पसंदीदा फ़ाइल प्रबंधक से कई फाइलें खोलते हैं।
रादु राईडेनू

4

मैंने एक छोटी स्क्रिप्ट लिखी थी /usr/local/bin/o, हालाँकि आप इसे कॉल कर सकते थे /usr/local/bin/xdg-openऔर डिफ़ॉल्ट कमांड को बदल सकते थे यदि आप चाहते थे (यह मानते हुए $PATHकि यह आपको प्राथमिकता देता है)। इसके अलावा, अगर इसे कोई तर्क नहीं दिया जाता है, तो यह स्क्रिप्ट वर्तमान निर्देशिका को बदलेगी।

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

यदि आप वर्तमान निर्देशिका को बिना किसी तर्क के खोलना नहीं चाहते हैं, तो यह डिफ़ॉल्ट व्यवहार को बरकरार रखता है, अर्थात उपयोग दिखाता है।

#!/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 यह कई तर्कों को पार्स करने की डिफ़ॉल्ट प्रोग्राम की क्षमता के बारे में अज्ञेयवादी है, लेकिन इसके बजाय प्रत्येक तर्क के लिए प्रत्येक कमांड को एक बार कॉल करेगा। मुझे नहीं लगता कि इसके आसपास कोई सुंदर तरीका है, क्योंकि उपयोगकर्ता xdg-openविभिन्न प्रकार की फाइलें चाहते हैं, और कुछ कमांड वैसे भी कई तर्क नहीं देंगे।


1

मैंने इस bashस्क्रिप्ट को उन सभी उपयोग मामलों को कवर करने के लिए लिखा है जिनके बारे में मैं सोच सकता था:

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

विशेषताएं:

  • टर्मिनल को प्रदूषित करने या उसे फेंकने के बजाय ~ / .xsession- त्रुटियों के लिए त्रुटि आउटपुट लिखता है
  • अधिकतम 10 फाइलें खोलने के लिए चूक (स्क्रीन / प्रोसेसर को अधिभार नहीं करने के लिए)
  • के साथ एक नया अधिकतम सेट कर सकते हैं max=20 open $(ls -Q)
  • सभी फ़ाइलों को खोलने की अनुमति दें, जैसे all=1 open $(ls -Q)

0

यहाँ एक लाइनर है:

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

जैसा कि मैंने वीएलसी स्थापित किया है (और एमपी 3 के लिए डिफ़ॉल्ट के रूप में), यह मेरे लिए वीएलसी के साथ एक निर्देशिका में सभी एमपी-फाइलें खोलता है। यह " सार्वभौमिक-हल-इट-ऑल-एंड-द-वर्क-इन-हर-फ्रेकिंग-केस " नहीं है, लेकिन यह काम करना चाहिए

स्पष्टीकरण:

ls -AQp"लगभग सभी" फाइलों को सूचीबद्ध करता है, फाइलनामों को उद्धृत करता है और निर्देशिकाओं के नामों को स्लैश करता है। बदलें -pके साथ --file-typeअगर आप सिमलिंक को बाहर करने के साथ ही कामना करते हैं। फ़ाइल नाम में रिक्त स्थान के मामले में उद्धृत करना।

grep "\.mp3\"$" केवल ".mp3" (प्लस डबल-उद्धरण) के साथ समाप्त होने वाली फ़ाइलों का चयन करता है।

xargs पूरे लॉट को पुनर्निर्देशित करता है कि प्रोग्राम के बाद सबस्क्राइब रिटर्न।

subshell:

xdg-mime query default audio/mpegउन फ़ाइलों के लिए डिफ़ॉल्ट ऐप का नाम "app.desktop" देता है, जिनका माइम है audio/mpeg। आप अपने वातावरण की किसी भी फ़ाइल के लिए mimetype की जाँच कर सकते हैं xdg-mime query filetype /path/to/file। मुझे एमपी-फाइल के लिए "ऑडियो / एमपीईजी" मिला।

grep -oP '.+(?=\.desktop)' "app.desktop" से "ऐप" मिलता है।

यदि आप इसे बहुत बार उपयोग करने वाले सिस्टम में उपयोग करने जा रहे हैं, तो आप इसे छोटा कर सकते हैं:

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

जहां आप default_appफाइलों के साथ खुलने वाले वास्तविक प्रोग्राम को बदल देते हैं। आप इसके साथ इसका नाम पता कर सकते हैं:

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


xdg-openइस समस्या के साथ काम नहीं करेगा, क्योंकि यह डिजाइन द्वारा केवल एक तर्क को स्वीकार करता है। यदि उपयोग xargs -n1कर रहे हैं, तो आप संभावित रूप से उस दीवार से टकराते हैं, जिसके परिणामस्वरूप आने वाला ऐप हर फ़ाइल को एक नए उदाहरण में खोल सकता है, जो एक से अधिक तरीकों से बदसूरत हो सकती है।


-1

आप इन कमांड का उपयोग कर सकते हैं

cd /path/to/source_folder

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

केवल तभी जब आपका म्यूजिक प्लेयर कमांड लाइन आर्ग्युमेंट के रूप में कई फाइलों का समर्थन करता है। vlcपसंद के अपने संगीत खिलाड़ी के साथ बदलें ।

यह मेरे परीक्षण में रिदमबॉक्स और वीएलसी के साथ काम करता है।


नहीं find... -execप्रत्येक फ़ाइल पर अलग-अलग कमांड चलाएं? और यह भी, अगर आपका संगीत खिलाड़ी कमांड लाइन तर्क के रूप में कई फ़ाइलों का समर्थन करता है, तो आप बस उपयोग कर सकते हैं vlc *.mp3
स्पार्कहॉक

@ श्रावक \+अंत में साथ नहीं
AB

@AB आह हाँ, अच्छी बात है; मैं गलत था। हालांकि, मेरे दूसरे वाक्य के अनुसार, findयदि आप हार्डकोड में जा रहे हैं तो इसका उपयोग करना व्यर्थ लगता vlcहै। (यह प्रश्न बताता है कि वे सभी एक ही निर्देशिका में हैं।)
स्परहॉक

बस +काफी है, कोई जरूरत नहीं है \+
Grumbel

-1

यदि आप VLC में फ़ाइलें खोलना चाहते हैं, तो एमपी 3 फ़ाइलों के लिए इस कमांड का उपयोग करें।

vlc /directory/*.mp3

नोट: cvlcइंटरफ़ेस के बिना वीएलसी का उपयोग करने के लिए उपयोग करें।


3
प्रश्न "डिफ़ॉल्ट प्रोग्राम" कहता है, इसलिए वीएलसी का सीधे उपयोग करना थोड़ा ... व्यर्थ है।
मुरु
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.