터미널에서 기본 프로그램으로 여러 파일을 여는 방법은 무엇입니까?


13

사용하여 폴더에서 모든 .mp3 파일을 열려고 xdg-open 했지만 하나만 여는 것을 알았습니다! 그래서 조금 검색했지만 그런 질문은 없었습니다! "확실히"찾았지만 텍스트 파일이 열리고 gnome-open도 하나의 파일을 엽니 다.

터미널의 폴더에서 동일한 형식의 모든 파일을 열고 싶습니다. 우분투를 처음 사용하므로 조금 더 설명해주세요.


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
주의 깊게 읽으면 "보다 강력하게 원한다면 ..."이라고 썼으므로 첫 번째 간단한 버전은 실제로 공백으로 작동하지 않지만 의도는 아닙니다. 두 번째 솔루션은 우분투에서 작동합니다. 참고로, 최신 버전의 기본 경로 이름은입니다.
Agoston Horvath

경로 부족이 두 번째 문제인지 확실하지 않습니다 (오류 메시지에도 불구하고). 넣을 .때 같은 오류 메시지가 나타납니다. 다른 디렉토리에서 나는 xdg-open: unexpected argument './foo.mp3'유무에 관계없이 얻 습니다 ..
Sparhawk

또한 이름에 공백을 두는 것이 "간단한"경우에도 무시해야 할 시나리오는 드문 일이 아니라고 생각합니다.
Sparhawk

확실히 말할 특정 설정에 대해서는 잘 모르지만 xdg-open은 새로운 우분투 설치에서 설명한대로 작동합니다. 확실하지 않으면 man xdg-open을 참조하십시오.
Agoston Horvath

4

당신은 시도 할 수 있습니다:

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

ls *.mp3현재 디렉토리의 모든 mp3 파일을 각각의 줄에 나열하고 출력을 while루프 마녀로 파이프하여 각 줄의 내용을 읽고 해당 내용을 엽니 다 (이 경우 mp3 파일의 이름) )를 기본 응용 프로그램에서


@karel 나는 -r깃발을 추가했다 . 이름에`\`가있는 파일을 올바르게 구문 분석하려면 이것이 필요하다고 생각합니다.
Sparhawk

2
음 ... 같은 프로그램의 여러 인스턴스가 열리지 않습니까?
Braiam

@karel 그래… 내 man read플래그도 전혀 없다! 내 테스트에서 오류가 발생하지 않지만, 내가 만든 때문에 그것은 아마 aaaaa\a. 이 경우에는 두 번 xdg-open열려고 시도 aaa하지 마십시오 aa\a. (좋아요, 조금 복잡해 지지만 코드가 모든 상황에서 작동해야한다고 생각합니다. 및 find의 한계를 피하기 위해 더 나은 옵션 일 것 입니다 .) 또한 어떻게 정확하게 혼란을 일으킬 수 있습니까? 의 출력을 구문 분석하지 않습니까? lsreadls
Sparhawk

@karel man read은 C 함수 읽기 (남자 섹션 2)를 참조합니다. 이것은 readbash 내장 명령이므로 man bash4632 줄을 봐야합니다. @Sparhawk-edititng 주셔서 감사합니다.
Radu Rădeanu

@Braiam umm ... 이것은 mp3의 경우가 아니며 기본 응용 프로그램의 설정에 따라 다릅니다. 노틸러스 또는 자주 사용하는 파일 관리자에서 여러 파일을 열 때와 동일한 동작입니다.
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가 설치되어 있고 mp3의 기본값으로 VLC가있는 디렉토리의 모든 mp3 파일이 열립니다. 이것은 어떤 종류의 " 유니버설 해결, 모든 것, 그리고 모든 작업에서 괴물 같은 경우 "는 아니지만 작동 해야 합니다.

설명:

ls -AQp"거의 모든"파일을 나열하고 파일 이름을 인용하고 디렉토리 이름에 슬래시를 추가합니다. 교체 -p--file-type당신은뿐만 아니라 심볼릭 링크를 제외하고자하는 경우. 파일 이름에 공백이있는 경우 인용.

grep "\.mp3\"$" ".mp3"(더하기 인용 부호)로 끝나는 파일 만 선택합니다.

xargs 다음 하위 쉘이 반환하는 프로그램으로 전체 로트를 리디렉션합니다.

서브 쉘 :

xdg-mime query default audio/mpegmime 파일의 기본 앱 이름을 "app.desktop"형식으로 제공합니다 audio/mpeg. 로 환경의 모든 파일에 대한 mimetype을 확인할 수 있습니다 xdg-mime query filetype /path/to/file. mp3 파일 용 "audio / mpeg"가 있습니다.

grep -oP '.+(?=\.desktop)' "app.desktop"에서 "app"를 가져옵니다.

많이 변경되지 않는 시스템에서 자주 사용하는 경우 다음과 같이 줄이십시오.

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 아 그래, 좋은 지적; 내가 틀렸어. 그러나 내 두 번째 문장에 따라 어쨌든 find하드 코딩 할 경우 사용 하는 것이 의미가 없는 것 같습니다 vlc. (질문은 모두 한 디렉토리에 있음을 시사합니다.)
Sparhawk

그냥은 +, 필요 충분하지 않습니다 \+.
Grumbel

-1

VLC에서 파일을 열려면 mp3 파일에이 명령을 사용하십시오.

vlc /directory/*.mp3

참고 : cvlc인터페이스없이 VLC를 사용 하려면 사용하십시오 .


3
질문에 "기본 프로그램"이 표시되어 있으므로 VLC를 직접 사용하는 것은 다소 의미가 없습니다.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.