Làm thế nào để mở nhiều tập tin với chương trình mặc định từ thiết bị đầu cuối?


13

Tôi đã cố mở tất cả các tệp .mp3 của mình từ một thư mục bằng cách sử dụng xdg-open nhưng tôi phát hiện ra nó chỉ mở một! Vì vậy, tôi đã tìm kiếm một chút nhưng không có câu hỏi như vậy! Tôi tìm thấy "evince" nhưng rõ ràng nó mở tệp văn bản và gnome-open cũng mở một tệp.

Tôi muốn mở tất cả các tệp có cùng định dạng trong một thư mục từ thiết bị đầu cuối. Tôi mới sử dụng Ubuntu, vì vậy hãy giải thích thêm một chút.


1
xdg-opennên thực sự có thể làm điều này theo mặc định ... chỉ cần chuyển danh sách đối số cho chương trình. Thôi nào mọi người freedesktop.org! :-)
Ciro Santilli 心 心 六四 事件

Câu trả lời:


8

Thật. Bạn có thể sử dụng shell để khắc phục điều này, như thế này:

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

Hoặc, nếu bạn muốn nó mạnh mẽ hơn, hãy thử

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

Cái đầu tiên không hoạt động với các tệp có khoảng trắng trong tên của chúng và cái thứ hai hoàn toàn không hoạt động ( find: paths must precede expression: -).
Sparhawk

1
Nếu bạn đọc kỹ, tôi đã viết "nếu bạn muốn nó mạnh mẽ hơn ...", do đó phiên bản đơn giản đầu tiên không hoạt động với không gian thực sự, nhưng đó không phải là ý định. Giải pháp thứ hai không hoạt động với Ubuntu; FYI, phiên bản mới hơn của mặc định tìm tên đường dẫn đến.
Agoston Horvath

Tôi không chắc chắn rằng việc thiếu đường dẫn là vấn đề trong lần thứ hai (mặc dù có thông báo lỗi). Tôi đã thử đưa vào .và nhận được thông báo lỗi tương tự. Trong một thư mục khác, tôi có xdg-open: unexpected argument './foo.mp3'hoặc không có ..
Sparhawk

Ngoài ra, tôi nghĩ rằng việc có không gian trong tên không phải là một kịch bản quá phổ biến mà nó nên bị coi thường, ngay cả trong các trường hợp "đơn giản".
Sparhawk

Tôi không biết đủ về thiết lập cụ thể của bạn để nói chắc chắn, nhưng xdg-open hoạt động như tôi đã mô tả trên bản cài đặt Ubuntu mới. Xem người đàn ông xdg-open nếu không chắc chắn.
Agoston Horvath

4

Bạn co thể thử:

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

ls *.mp3wil liệt kê tất cả các tệp mp3 từ thư mục hiện tại, mỗi tệp trên một dòng riêng và đầu ra được dẫn đến một whilephù thủy vòng lặp đọc nội dung của từng dòng và nó sẽ mở ra nội dung đó (là tên của tệp mp3 trong trường hợp này ) trong ứng dụng mặc định của nó.


@karel Tôi thêm -rcờ. Tôi nghĩ rằng điều này là cần thiết để phân tích chính xác các tệp với một `\` trong tên của chúng.
Sparhawk

2
umm ... điều này sẽ không mở một số trường hợp của cùng một chương trình?
Braiam

@karel Yeah, tôi man readcũng không có bất kỳ cờ nào được liệt kê cả! Tôi không gặp lỗi trong thử nghiệm của mình, nhưng đó có thể là do tôi đã tạo aaaaa\a. Trong trường hợp này, xdg-openchỉ cần cố gắng mở aaahai lần, và không aa\a. (Được rồi, nó sẽ hơi phức tạp một chút, nhưng tôi nghĩ rằng mã nên hoạt động trong mọi tình huống. Có lẽ findlà một lựa chọn tốt hơn, để tránh những hạn chế của lsread.) Không phải nó sẽ chỉ phân tích đầu ra lssao?
Sparhawk

@karel man readđang giới thiệu chức năng đọc C (phần 2 của người đàn ông). Đây readlà một lệnh bash dựng sẵn, vì vậy bạn nên tìm ở man bashđâu đó tại dòng 4632. @Sparhawk - cảm ơn vì đã chỉnh sửa.
Radu Rădeanu

@Braiam umm ... đây không phải là trường hợp của mp3 và phụ thuộc vào cài đặt từ ứng dụng mặc định. Hành vi tương tự như khi bạn mở nhiều tệp từ Nautilus hoặc trình quản lý tệp yêu thích của bạn.
Radu Rădeanu

4

Tôi đã viết một tập lệnh nhỏ /usr/local/bin/o, mặc dù bạn chỉ có thể gọi nó /usr/local/bin/xdg-openvà thay thế lệnh mặc định nếu bạn muốn (giả sử bạn $PATHưu tiên cho nó). Ngoài ra, nếu nó không được đưa ra đối số, tập lệnh này sẽ mở thư mục hiện tại thay thế.

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

Nếu bạn không muốn mở thư mục hiện tại mà không có đối số, điều này sẽ giữ hành vi mặc định, tức là hiển thị việc sử dụng.

#!/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 đây là bất khả tri về khả năng phân tích nhiều đối số của chương trình mặc định, nhưng thay vào đó sẽ gọi mỗi lệnh một lần cho mỗi đối số. Tôi không nghĩ rằng có một cách thanh lịch xung quanh vấn đề này, vì người dùng có thể muốn xdg-opencác loại tệp khác nhau và một số lệnh sẽ không nhận nhiều đối số.


1

Tôi đã viết bashkịch bản này để bao gồm tất cả các trường hợp sử dụng mà tôi có thể nghĩ ra:

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

Đặc trưng:

  • Ghi đầu ra lỗi thành ~ / .xsession-lỗi thay vì làm ô nhiễm thiết bị đầu cuối hoặc ném nó đi
  • Mặc định để mở tối đa 10 tệp (để không làm quá tải màn hình / bộ xử lý)
  • Có thể thiết lập mức tối đa mới với max=20 open $(ls -Q)
  • Cho phép mở tất cả các tệp, ví dụ: all=1 open $(ls -Q)

0

Đây là một lót:

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

Khi tôi đã cài đặt VLC (và như một mặc định cho mp3), điều này sẽ mở tất cả các tệp mp3 trong một thư mục có VLC cho tôi. Đây không phải là bất kỳ loại " phổ quát giải quyết-tất cả và công việc trong mọi trường hợp kỳ dị ", nhưng nó sẽ hoạt động.

Giải trình:

ls -AQpliệt kê các tệp "gần như tất cả", trích dẫn tên tệp và thêm dấu gạch chéo vào tên của các thư mục. Thay thế -pbằng --file-typenếu bạn muốn loại trừ symlink là tốt. Trích dẫn trong trường hợp không gian trong tên tập tin.

grep "\.mp3\"$" chỉ chọn các tệp kết thúc bằng ".mp3" (cộng với trích dẫn kép).

xargs chuyển hướng toàn bộ lô để lập trình theo sau trả về subshell.

subshell:

xdg-mime query default audio/mpegcung cấp cho ứng dụng mặc định tên 's ở định dạng 'app.desktop' cho các tập tin có kịch câm là audio/mpeg. Bạn có thể kiểm tra mimetype cho bất kỳ tệp nào trong môi trường của bạn với xdg-mime query filetype /path/to/file. Tôi có "audio / mpeg" cho tệp mp3.

grep -oP '.+(?=\.desktop)' nhận được "ứng dụng" từ "app.desktop".

Nếu bạn sẽ sử dụng nó rất thường xuyên trong một hệ thống sẽ không thay đổi nhiều, bạn có thể muốn rút ngắn nó về điều này:

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

Nơi bạn thay thế default_appbằng chương trình thực tế mở bằng các tệp. Bạn có thể tìm ra tên của nó với điều này:

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


xdg-opensẽ không làm việc với vấn đề này, bởi vì nó chỉ chấp nhận một đối số theo thiết kế. Nếu sử dụng xargs -n1, bạn chắc chắn sẽ gặp rắc rối với ứng dụng kết quả được đề cập có thể mở mọi tệp trong một trường hợp mới, có thể trở nên xấu xí theo nhiều cách.


-1

Bạn có thể sử dụng các lệnh này

cd /path/to/source_folder

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

chỉ khi trình phát nhạc của bạn hỗ trợ nhiều tệp làm đối số dòng lệnh. Thay thế vlcbằng máy nghe nhạc của bạn lựa chọn.

Điều này hoạt động với RhybeatBox và VLC trong thử nghiệm của tôi.


Không find... -execchạy các lệnh riêng lẻ trên mỗi tệp? Ngoài ra, nếu trình phát nhạc của bạn hỗ trợ nhiều tệp làm đối số dòng lệnh, bạn có thể sử dụng vlc *.mp3.
Sparhawk

@Sparhawk Không có \+ở cuối
AB

@AB À đúng rồi, điểm tốt; Tôi đã sai. Tuy nhiên, theo câu thứ hai của tôi, dường như vô nghĩa khi sử dụng findnếu bạn định sử dụng mã cứng vlc. (Câu hỏi gợi ý rằng tất cả chúng đều nằm trong một thư mục.)
Sparhawk

Chỉ cần +là đủ, không cần \+.
Grumbel

-1

Sử dụng lệnh này cho các tệp mp3 nếu bạn muốn mở tệp trong VLC.

vlc /directory/*.mp3

Lưu ý: Sử dụng cvlcđể sử dụng VLC không có giao diện.


3
Câu hỏi cho biết "chương trình mặc định", vì vậy sử dụng VLC trực tiếp là một chút ... vô nghĩa.
muru
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.