วิธีการเปิดหลายไฟล์ด้วยโปรแกรมเริ่มต้นจาก terminal?


13

ฉันพยายามเปิดไฟล์. mp3 ทั้งหมดของฉันจากโฟลเดอร์ที่ใช้xdg-open แต่ฉันพบว่ามันเปิดขึ้นมาเพียงไฟล์เดียว! ดังนั้นฉันจึงค้นหาเล็กน้อย แต่ไม่มีคำถามเช่นนั้น! ฉันพบ "evince" แต่เห็นได้ชัดว่ามันเปิดไฟล์ข้อความและ gnome-open ก็เปิดหนึ่งไฟล์

ฉันต้องการเปิดไฟล์ทั้งหมดในรูปแบบเดียวกันในโฟลเดอร์จากเทอร์มินัล ฉันใหม่กับ Ubuntu ดังนั้นโปรดอธิบายเพิ่มเติมอีกหน่อย


1
xdg-openควรจะสามารถทำสิ่งนี้ได้โดยค่าเริ่มต้น ... เพียงแค่ส่งรายการอาร์กิวเมนต์ไปยังโปรแกรม มากับคนที่ freedesktop.org! :-)
Ciro Santilli 冠状病毒审查六四事件法轮功

คำตอบ:


8

จริง คุณสามารถใช้เปลือกเพื่อหลีกเลี่ยงสิ่งนี้เช่นนี้

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

หรือถ้าคุณต้องการให้มันแข็งแกร่งขึ้นลอง

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

คนแรกไม่สามารถใช้งานไฟล์ที่มีช่องว่างในชื่อของพวกเขาและคนที่สองไม่สามารถใช้งานได้เลย ( find: paths must precede expression: -)
Sparhawk

1
ถ้าคุณอ่านอย่างถี่ถ้วนฉันเขียนว่า "ถ้าคุณต้องการให้มันแข็งแกร่งกว่านี้ ... " ดังนั้นเวอร์ชั่นแรกที่เรียบง่ายไม่สามารถใช้งานได้กับช่องว่างแน่นอน แต่นั่นไม่ใช่ความตั้งใจ โซลูชันที่สองใช้งานได้กับ Ubuntu FYI เวอร์ชันการค้นหารุ่นใหม่จะใช้ชื่อพา ธ เป็นค่าเริ่มต้น
Agoston Horvath

ฉันไม่แน่ใจว่าการขาดเส้นทางเป็นปัญหาในครั้งที่สอง (แม้จะมีข้อความแสดงข้อผิดพลาด) ฉันลองใส่.และได้รับข้อความแสดงข้อผิดพลาดเดียวกัน ในไดเรกทอรีอื่นฉันจะได้รับมีหรือไม่มีxdg-open: unexpected argument './foo.mp3' .
Sparhawk

นอกจากนี้ฉันคิดว่าการมีช่องว่างในชื่อไม่ใช่เรื่องแปลกที่ควรจะมองข้ามแม้ในกรณี "ง่าย"
Sparhawk

ฉันไม่รู้เกี่ยวกับการตั้งค่าเฉพาะของคุณที่จะพูดได้อย่างแน่นอน แต่ xdg-open ใช้งานได้ตามที่ฉันอธิบายไว้ในการติดตั้ง Ubuntu ใหม่ ดู man xdg-open ถ้าไม่แน่ใจ
Agoston Horvath

4

คุณสามารถลอง:

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

ls *.mp3wil จะแสดงรายการไฟล์ mp3 ทั้งหมดจากไดเรกทอรีปัจจุบันโดยแต่ละไฟล์จะอยู่ในบรรทัดของตัวเองและเอาต์พุตจะถูกไพพ์ไปที่whileแม่มดลูปอ่านเนื้อหาของแต่ละบรรทัดและจะเปิดเนื้อหานั้น (ซึ่งเป็นชื่อของไฟล์ mp3 ในกรณีนี้ ) ในแอปพลิเคชันเริ่มต้น


@karel ฉันเพิ่ม-rธง ฉันคิดว่านี่เป็นสิ่งที่จำเป็นในการแยกวิเคราะห์ไฟล์ด้วยชื่อ `` `อย่างถูกต้อง
Sparhawk

2
อืมม ... สิ่งนี้จะเปิดหลาย ๆ ครั้งของโปรแกรมเดียวกันหรือไม่?
Braiam

@karel ใช่…ฉันman readไม่มีธงใด ๆ เลย! ฉันไม่ได้รับข้อผิดพลาดในการทดสอบของฉัน แต่ที่อาจจะเป็นเพราะผมสร้างและaaa aa\aในกรณีนี้xdg-openเพียงแค่พยายามที่จะเปิดสองครั้งและไม่ได้aaa aa\a(โอเคมันกำลังสับสนเล็กน้อย แต่ฉันคิดว่าโค้ดควรใช้ได้กับทุกสถานการณ์บางทีอาจfindเป็นตัวเลือกที่ดีกว่าเพื่อหลีกเลี่ยงข้อ จำกัด ของlsและread.) นอกจากนี้มันจะสร้างความหายนะได้อย่างไร? ไม่เพียง แต่จะแยกวิเคราะห์ผลลัพธ์ของls?
Sparhawk

@karel man readกำลังอ้างถึงฟังก์ชั่น C ที่อ่าน (ส่วนที่ 2 ของผู้ชาย) นี่readเป็นคำสั่ง bash builtin ดังนั้นคุณควรดูman bashที่บรรทัด 4632 @Sparhawk - ขอบคุณสำหรับการแก้ไข
Radu Rădeanu

@Braiam umm ... นี่ไม่ใช่กรณีของ mp3 และขึ้นอยู่กับการตั้งค่าจากแอปพลิเคชันเริ่มต้น ลักษณะการทำงานจะเหมือนกันเมื่อคุณเปิดหลายไฟล์จาก Nautilus หรือตัวจัดการไฟล์ที่คุณโปรดปราน
Radu Rădeanu

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-errors แทนที่จะสร้างมลพิษต่อเทอร์มินัลหรือทิ้งมันไป
  • เริ่มต้นที่การเปิดสูงสุด 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)'`

เมื่อฉันติดตั้ง VLC (และเป็นค่าเริ่มต้นสำหรับ mp3s) สิ่งนี้จะเปิดไฟล์ mp3 ทั้งหมดในไดเรกทอรีที่มี VLC สำหรับฉัน นี่ไม่ใช่ประเภทใด ๆ ของ " universal-solution-it-all-and-work-in-every-freaking-case " แต่มันควรจะใช้ได้

คำอธิบาย:

ls -AQpแสดงรายการไฟล์ "เกือบทั้งหมด" อ้างถึงชื่อไฟล์และต่อท้ายสแลชกับชื่อของไดเรกทอรี แทนที่-pด้วย--file-typeหากคุณต้องการยกเว้นการเชื่อมโยงด้วย การอ้างอิงในกรณีที่มีช่องว่างในชื่อไฟล์

grep "\.mp3\"$" เลือกเฉพาะไฟล์ที่ลงท้ายด้วย ".mp3" (บวกเครื่องหมายคำพูดคู่)

xargs เปลี่ยนเส้นทางล็อตทั้งหมดไปยังโปรแกรมที่ส่งคืน subshell

subshell:

xdg-mime query default audio/mpegช่วยให้แอปเริ่มต้นชื่อ 's ในรูปแบบ 'app.desktop' audio/mpegสำหรับไฟล์ที่มีละครใบ้คือ คุณสามารถตรวจสอบชนิด mime สำหรับไฟล์ใด ๆ xdg-mime query filetype /path/to/fileในสภาพแวดล้อมของคุณด้วย ฉันได้ "audio / mpeg" สำหรับไฟล์ mp3

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ด้วยเครื่องเล่นเพลงที่คุณเลือก

สิ่งนี้ใช้ได้กับ RhythmBox และ VLC ในการทดสอบของฉัน


ไม่find... -execเรียกใช้คำสั่งแต่ละคำสั่งในแต่ละไฟล์หรือไม่ vlc *.mp3และยังถ้าเครื่องเล่นเพลงของคุณรองรับไฟล์หลายคนเป็นอาร์กิวเมนต์บรรทัดคำสั่งคุณสามารถทำได้เพียงแค่การใช้งาน
Sparhawk

@Sparhawk ไม่ใช่กับ\+ท้าย
AB

@AB Ah ใช่จุดดี; ฉันผิดไป. อย่างไรก็ตามตามประโยคที่สองของฉันดูเหมือนว่าไม่มีประโยชน์ที่จะใช้findถ้าคุณกำลังจะ hardcode vlcต่อไป (คำถามแสดงให้เห็นว่าพวกเขาทั้งหมดอยู่ในไดเรกทอรีเดียว)
Sparhawk

เพียงก็พอไม่จำเป็นต้องให้+ \+
Grumbel

-1

ใช้คำสั่งนี้สำหรับไฟล์ mp3 หากคุณต้องการเปิดไฟล์ใน VLC

vlc /directory/*.mp3

หมายเหตุ: ใช้cvlcเพื่อใช้ VLC โดยไม่มีส่วนต่อประสาน


3
คำถามที่ว่า "โปรแกรมเริ่มต้น" ดังนั้นการใช้ VLC โดยตรงเป็นบิต ... ไม่มีจุดหมาย
muru
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.