मैं कमांड लाइन के माध्यम से फ़ाइल / निर्देशिका पथ का चयन करने के लिए GUI संवाद बॉक्स के साथ उपयोगकर्ताओं को संकेत कैसे दे सकता हूं?


16

मान लीजिए कि मेरे पास इस तरह से एक स्क्रिप्ट है:

(उदाहरण एक rysnc उपयोग मामले को दर्शाया गया है)

#!/bin/bash
echo -n "Enter Source Directory:"
read srcdir
echo -n "Enter Destination Directory:"
read dstdir
rsync -av --delete "$srcdir" "$dstdir"

यहाँ विचार उपयोगकर्ता को "स्रोत" और "गंतव्य" निर्देशिकाओं में प्रवेश करने के लिए rsync के साथ काम करने के लिए संकेत देने के लिए है। जैसा है, उपयोगकर्ता को कमांड-लाइन के माध्यम से मैन्युअल रूप से दर्ज करना होगा /path/to/directory/

इसके बजाय , मैं उपयोगकर्ता को GUI इंटरफ़ेस के माध्यम से पथ दर्ज करने के लिए संकेत देना चाहता हूं

कुछ इस तरह: screem


एक GUI चयन विंडो के साथ उपयोगकर्ता को संकेत देने के लिए मैं कौन सी कमांड का उपयोग कर सकता हूं जो कमांड-लाइन में फ़ाइल पथ लौटाता है?


2
आप Zenity का उपयोग कर सकते हैं: help.gnome.org/users/zenity/stable/file-selection.html.en
TuKsn

4
कृपया GUI विंडो के उपयोग के बारे में चेतावनी जोड़ना याद रखें। अनावश्यक विंडोज़ पॉप अप करने से उन्नत उपयोगकर्ताओं पर रोष उत्पन्न हो सकता है।
unperson325680

5
क्यों, ओह आप कभी भी इस तरह के कष्टप्रद "सुविधा" को क्यों लागू करना चाहेंगे? याद रखें कि यदि हम कमांड लाइन पर निर्देशिकाओं को दर्ज करते हैं तो हम टैब समापन का उपयोग कर सकते हैं, और लोड करने के लिए कुछ गिनी-चुनी प्रतीक्षा करने की आवश्यकता नहीं है। कोई भी एक GUI को पूरी तरह से अच्छी शेल स्क्रिप्ट में क्यों जोड़ना चाहेगा, यह मेरे से परे है।
टेराडॉन

1
चूंकि हम प्रतिमानों को मिला रहे हैं, तो उपयोगकर्ता को वेब ऐप के माध्यम से रास्ते क्यों नहीं मिलते?
ट्यूलेंस कोर्डोवा

4
@terdon क्योंकि यदि हम स्क्रिप्ट को सीधे चलाते हैं और टर्मिनल में नहीं चलाते हैं तो मैं GUI विंडो प्रदान करना चाहता हूं।
पंड्या

जवाबों:


34

आप इसे फ़ाइलों के लिए उपयोग कर सकते हैं:

zenity --file-selection

और यह फ़ोल्डर के लिए:

zenity --file-selection --directory

उपयोग के लिए, भागो:

zenity --help-general
zenity --help-file-selection

आम तौर पर यह वर्तमान विषय (वैसे भी जीटीके खिड़की के प्रबंधकों के लिए) से मेल खाता है, मेरी मशीन पर ज़ुकिटवू 3.8 के एक modded संस्करण के साथ यह इस तरह दिखता है:

इसका उपयोग करने का एक तरीका इस प्रकार है:

echo "you selected $(zenity --file-selection)"

जिसके परिणामस्वरूप होगा you selected /path/to/file

आप एक उपयुक्त शीर्षक सेट करने के लिए विकल्पों का भी उपयोग कर सकते हैं, और यह जिस निर्देशिका में शुरू होता है - अपने rsync उपयोग के मामले के साथ, उदाहरण के लिए:

zenity --file-selection --directory --title="Choose rsync source directory" --filename=$HOME/Desktop/

फ़ाइलों के लिए, आप चयन करने के लिए फ़ाइल नाम भी निर्दिष्ट कर सकते हैं - उदाहरण के लिए:

zenity --file-selection --file-filter='PDF files (pdf) | *.pdf' --title="Select a PDF file"

नोट: आप भी उपयोग कर सकते हैं YAD , Zenity का एक कांटा भार अधिक सुविधाओं है।

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad

स्रोत

अधिकांश भाग के लिए आप इसे उसी तरह से उपयोग कर सकते हैं - फ़ाइल ब्राउज़र के लिए:

yad --file-selection

और सहायता पृष्ठ के लिए:

yad --help-all

हालांकि उस समय (संस्करण 26 के आसपास?), इसे नए GTK 3.14+ इंटरफ़ेस (zenity has) से मेल करने के लिए अपडेट नहीं किया गया था - इसकी अधिक विशेषताएं हैं, लेकिन संगतता की जांच करें (प्रलेखन के आधार पर इसे GTK +> = 2.16 पर काम करना चाहिए। 0


2
याड ज़ेनिटी के नाटकीय रूप से बढ़ा हुआ कांटा है और ज़ेनिटी प्रोजेक्ट के निष्क्रिय होने के बाद इसे काफी हद तक बदल दिया गया है। मैं देख रहा हूँ कि ज़ेनिटी अब Gnome.org (Gnome3?) पर विकास में वापस आ गया है, लेकिन मुझे कोई रास्ता नहीं है कि इसे डाउनलोड करें।
DocSalvager

@DocSalvage - वह पृष्ठ काफी प्राचीन है - यह कहता है कि अगली रिलीज़ '3.2' - मेरे पास संस्करण है 3.8 अब एक काफी-पुरानी फेडोरा 19 प्रणाली पर (सूक्ति 3.8 के साथ - सूक्ति के प्रत्येक संस्करण के लिए सूक्ति के कुछ बिट्स अपडेट किए गए हैं) इसलिए शायद इसे 3.10 + 3.12) के लिए अपडेट किया गया है)। यह 2005-2009 से बग रिपोर्ट के साथ ही अंतिम सौदा करता है। आप उबंटू रिपॉजिट - package.ubuntu.com/trusty/zenity से नवीनतम स्थिर संस्करण (3.8 फिर से) प्राप्त कर सकते हैं । आपको यहां याद के संकलित संस्करण भी खोजने में सक्षम होना चाहिए ।
विल्फ

यद काफी अच्छा लग रहा है - इसमें जिनी से अधिक विकल्प हैं :)
विल्फ

1
@Ilff हां, यार स्टेरॉयड पर ज़ेनिटी है। एक बार जब आप इसे पकड़ लेते हैं, तो यह इतना लचीला हो जाता है। मैं रूपांतरित हूं। मैं yadded (विरोध नहीं कर सका, माफ करना) नीचे ओपी प्रश्न के लिए एक प्रतिक्रिया है, btw।
स्कूबी -2

@ स्कूबी -2 कूल ने जवाब देने के लिए इंस्टाल्ड इंस्ट्रक्शन्स दिए (ताकि भविष्य के यूजर्स को कमेंट्स न करने
पड़ें

19

सिर्फ रिकॉर्ड के लिए, आप dialogटेक्स्ट-आधारित यूजर इंटरफेस (टीयूआई) समाधान के लिए उपयोग कर सकते हैं।

वाक्य - विन्यास:

dialog --title "text" --fselect /path/to/dir height width

उदाहरण:

FILE=$(dialog --stdout --title "Please choose a file" --fselect $HOME/ 14 48)
echo "${FILE} file chosen."

आउटपुट कुछ इस तरह होगा:

उदाहरण

जैसा कि @Wilf द्वारा बताया गया है, आप टर्मिनल को भरने के लिए $LINESऔर $COLUMNSचर का उपयोग कर सकते हैं :

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))

1
हालांकि यह सही वैकल्पिक समाधान है, लेकिन यह GUI विंडो प्रदान नहीं करता है जैसा कि प्रश्न में वर्णित है!
पंड्या

2
मुझे पता है, लेकिन किसी और को यह उपयोगी लग सकता है। मैंने किसी भी भ्रम से बचने के लिए स्क्रीनशॉट पोस्ट किया।
क्रैक्सर

7
और, निष्पक्ष होने के लिए, यह GUI IMHO के रूप में योग्य है।
क्रैक्सर

3
GUIs और TUIs (टेक्स्ट यूआई) के बीच आमतौर पर उपयोग की जाने वाली लाइन "परमाणु" का आकार है: क्या यह एक पिक्सेल या एक चरित्र है?
unperson325680

3
अच्छा उत्तर - कुछ टर्मिनलों की चौड़ाई और ऊंचाई को वैरिएबल द्वारा परिभाषित किया गया है जैसे $LINESऔर $COLUMNS- इसलिए आप $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))इसे टर्मिनल या स्क्रीन विंडो को भरने के लिए चलाते हैं।
विल्फ

5

मुझे पता है कि यह 8 महीने का है और यह भी कि ओपी के सवाल का जवाब दिया गया है। हालाँकि, yad का उल्लेख किया गया है लेकिन कोई उदाहरण पेश नहीं किया गया है। यहाँ yad का उपयोग कर मेरा समाधान है।

DIR="/home" \
i=0;for location in source destination
do
((i++));selection[$i]=$(yad --center \
--width 350 \
--form \
--title="yad example" \
--text="Select $location directory" \
--field=:LBL "" \
--field=Path:DIR "$DIR" \
--separator='' )
done;\
echo "Command to run is \"rsync -av --delete ${selection[1]} ${selection[2]}\""

जिस तरह से यह काम करता है वह इस तरह है। हम पाश के लिए एक में Yad शब्दों में कहें, चर की स्थापना $locationकरने के लिए sourceपहले पारित करने के लिए और destinationदूसरे के लिए। आउटपुट को सरणी में रखा गया है selection[]जिसके लिए चर iको सूचकांक के रूप में उपयोग किया जाता है। यह शुरुआत में 0 पर सेट है और प्रत्येक पास के साथ बढ़ा हुआ है। इसलिए स्रोत ${selection[1]}और गंतव्य के रूप में सहेजा जाता है ${selection[2]}

पहली पंक्ति पर DIR = "/ home" संवाद डिफ़ॉल्ट सेट करता है। टाइप करके yad कमांड विकल्प टर्मिनल से पाया जा सकता है yad --help

याद स्क्रीनशॉट


2

यहाँ उत्तर के लिए सबसे छोटा (और सबसे अच्छा) समाधान है: Yadजैसा zenityकरता है वैसा ही सटीक विकल्प प्रदान करता है:

yad --file-selection --directory

यह एक निर्देशिका चयन संवाद खोलता है। अतिरिक्त तर्क के बिना --directoryयह एक फ़ाइल चयन संवाद होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.