Bagaimana cara meminta pengguna dengan kotak dialog GUI untuk memilih jalur file / direktori, melalui baris perintah?

15

Misalkan saya memiliki skrip seperti ini:

(Contoh ini menggambarkan case penggunaan rysnc)

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

Idenya di sini adalah untuk meminta pengguna untuk memasukkan direktori "Sumber" dan "Tujuan" agar rsync dapat digunakan. Seperti, pengguna harus masuk secara manual /path/to/directory/ melalui command-line.

Sebagai gantinya , saya ingin meminta pengguna untuk memasukkan jalur melalui antarmuka GUI .

Sesuatu seperti ini: screem


Perintah apa yang dapat saya gunakan untuk meminta pengguna dengan jendela pilihan GUI yang mengembalikan jalur file ke baris perintah?

Pandya
sumber
2
Anda dapat menggunakan Zenity: help.gnome.org/users/zenity/stable/file-selection.html.en
TuKsn
4
Harap ingat untuk menambahkan peringatan tentang penggunaan windows GUI. Jendela yang tidak perlu muncul dapat menyebabkan kemarahan pada pengguna tingkat lanjut.
unperson325680
5
Mengapa, oh mengapa Anda ingin menerapkan "fitur" yang begitu menyebalkan itu? Ingatlah bahwa jika kita memasuki direktori di baris perintah kita dapat menggunakan penyelesaian tab, dan tidak perlu menunggu gui untuk memuat. Mengapa ada orang yang ingin menambahkan GUI ke skrip shell yang sangat bagus ada di luar jangkauan saya.
terdon
1
Karena kita sedang mencampuradukkan paradigma, mengapa tidak mendapatkan pengguna memasukkan jalur melalui aplikasi web?
Tulains Córdova
4
@terdon Karena jika kita menjalankan skrip secara langsung & tidak Jalankan di terminal maka saya ingin memberikan jendela GUI.
Pandya

Jawaban:

33

Anda dapat menggunakan ini untuk file:

zenity --file-selection

dan ini untuk folder:

zenity --file-selection --directory

untuk penggunaan, jalankan:

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

Secara umum ini cocok dengan tema saat ini (untuk pengelola jendela GTK), di komputer saya dengan versi modded Zukitwo 3.8 tampilannya seperti ini:

Salah satu cara menggunakannya adalah seperti ini:

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

Yang akan menghasilkan you selected /path/to/file.

Anda juga dapat menggunakan opsi untuk mengatur judul yang sesuai, dan direktori tempat dimulainya - Dengan case penggunaan rsync Anda, misalnya:

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

Untuk file, Anda juga dapat menentukan tipe file yang akan dipilih - misalnya:

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

CATATAN: Anda juga dapat menggunakan YAD , garpu Zenity yang memiliki lebih banyak fitur.

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

Sumber

Sebagian besar Anda dapat menggunakannya dengan cara yang sama - untuk browser file:

yad --file-selection

dan untuk halaman bantuan:

yad --help-all

Meskipun pada saat itu (sekitar versi 26?), Itu belum diperbarui untuk mencocokkan antarmuka GTK 3.14+ baru (zenity miliki) - ia memiliki lebih banyak fitur, tetapi memeriksa kompatibilitas (berdasarkan dokumentasi itu harus bekerja pada GTK +> = 2.16. 0

Wilf
sumber
2
Yad adalah cabang Zenity yang ditingkatkan secara dramatis dan sebagian besar telah menggantinya sejak proyek Zenity menjadi tidak aktif. Saya melihat bahwa Zenity sekarang kembali dalam pengembangan di Gnome.org (hanya Gnome3?) Tetapi saya tidak melihat cara mengunduhnya.
DocSalvager
@ DocSalvage - halaman itu cukup kuno - ia mengatakan rilis berikutnya '3.2' - Saya memiliki versi 3.8 pada sistem Fedora 19 yang sekarang cukup lama (dengan Gnome 3.8 - beberapa bit gnome diperbarui untuk setiap versi shell Gnome ( jadi itu mungkin telah diperbarui untuk 3,10 + 3,12)). Terakhir berkaitan dengan laporan bug dari 2005-2009 juga. Anda bisa mendapatkan versi stabil terbaru (3,8 lagi) dari repo Ubuntu - packages.ubuntu.com/trusty/zenity . Anda juga harus dapat menemukan versi kompilasi Yad di sini .
Wilf
Yad terlihat cukup bagus - ia memiliki lebih banyak pilihan daripada zenity :)
Wilf
1
@ Will Ya, yad adalah Zenity pada steroid. Setelah Anda bisa menguasainya, batu itu bergoyang karena sangat fleksibel. Saya seorang mualaf. Saya berteriak (tidak bisa menahannya, maaf) menanggapi pertanyaan OP di bawah ini, btw.
Scooby-2
@ Scooby-2 keren menambahkan petunjuk menginstal untuk menjawab (sehingga pengguna masa depan tidak perlu melakukan komentar)
Wilf
19

Sekadar catatan, Anda dapat menggunakan dialoguntuk solusi Antarmuka Pengguna Berbasis Teks (TUI).

Sintaksis:

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

Contoh:

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

Outputnya akan seperti ini:

Contoh

Seperti yang ditunjukkan oleh @Wilf, Anda dapat menggunakan $LINESdan $COLUMNSvariabel untuk membuatnya memenuhi terminal:

$(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))
kraxor
sumber
1
Meskipun ini merupakan solusi alternatif yang tepat tetapi tidak memberikan jendela GUI seperti yang disebutkan dalam pertanyaan!
Pandya
2
Saya tahu, tetapi orang lain mungkin menganggapnya berguna. Saya memposting tangkapan layar untuk menghindari kebingungan.
kraxor
7
Dan, agar adil, itu memenuhi syarat sebagai IMHO GUI.
kraxor
3
Garis yang biasa digunakan antara GUI dan TUI (UI tekstual) adalah ukuran "atom": apakah itu pixel atau karakter?
unperson325680
3
Jawaban yang bagus - lebar dan tinggi beberapa terminal ditentukan oleh variabel seperti $LINESdan $COLUMNS- jadi Anda menjalankannya $(dialog --stdout --title "Please choose a file" --fselect $HOME/ $(expr $LINES - 15) $(expr $COLUMNS - 10))agar memenuhi terminal / jendela layar.
Wilf
5

Saya tahu ini berumur 8 bulan dan juga pertanyaan OP telah dijawab. Namun, yad telah disebutkan tetapi tidak ada contoh yang ditawarkan. Inilah solusi saya menggunakan 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]}\""

Cara kerjanya seperti ini. Kami menempatkan yad di dalam for loop, mengatur variabel $locationmenjadi sourceuntuk pass pertama dan destinationuntuk yang kedua. Output ditempatkan dalam array selection[]yang variabel idigunakan sebagai indeks. Ini diatur ke 0 di awal dan bertambah dengan setiap pass. Karenanya sumber disimpan sebagai ${selection[1]}dan tujuan ${selection[2]}.

DIR = "/ home" pada baris pertama menetapkan default dialog. Opsi perintah yad dapat ditemukan dari terminal dengan mengetik yad --help.

tangkapan layar yad

Scooby-2
sumber
2

Berikut adalah solusi terpendek (dan terbaik) untuk jawabannya: berikan Yadopsi yang tepat seperti zenityhalnya:

yad --file-selection --directory

Ini membuka dialog pemilihan direktori. Tanpa argumen tambahan --directoryitu akan menjadi dialog pemilihan file.

TheUnseen
sumber