답변:
과연. 쉘을 사용하여 다음과 같이 해결할 수 있습니다.
ls -b *.mp3 | xargs -n 1 xdg-open
또는 더 강력하게하려면
find -iname '*.mp3' -print0 | xargs -0 -n 1 xdg-open
find: paths must precede expression: -
).
.
때 같은 오류 메시지가 나타납니다. 다른 디렉토리에서 나는 xdg-open: unexpected argument './foo.mp3'
유무에 관계없이 얻 습니다 .
.
당신은 시도 할 수 있습니다:
ls *.mp3 | while read -r file; do xdg-open "$file"; done
ls *.mp3
현재 디렉토리의 모든 mp3 파일을 각각의 줄에 나열하고 출력을 while
루프 마녀로 파이프하여 각 줄의 내용을 읽고 해당 내용을 엽니 다 (이 경우 mp3 파일의 이름) )를 기본 응용 프로그램에서
-r
깃발을 추가했다 . 이름에`\`가있는 파일을 올바르게 구문 분석하려면 이것이 필요하다고 생각합니다.
man read
플래그도 전혀 없다! 내 테스트에서 오류가 발생하지 않지만, 내가 만든 때문에 그것은 아마 aaa
와 aa\a
. 이 경우에는 두 번 xdg-open
열려고 시도 aaa
하지 마십시오 aa\a
. (좋아요, 조금 복잡해 지지만 코드가 모든 상황에서 작동해야한다고 생각합니다. 및 find
의 한계를 피하기 위해 더 나은 옵션 일 것 입니다 .) 또한 어떻게 정확하게 혼란을 일으킬 수 있습니까? 의 출력을 구문 분석하지 않습니까? ls
read
ls
man read
은 C 함수 읽기 (남자 섹션 2)를 참조합니다. 이것은 read
bash 내장 명령이므로 man bash
4632 줄을 봐야합니다. @Sparhawk-edititng 주셔서 감사합니다.
작은 스크립트 /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
다른 종류의 파일을 원할 수도 있고 일부 명령은 여러 인수를 취하지 않기 때문에이 문제를 해결할 수있는 우아한 방법이 없다고 생각 합니다.
내가 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
풍모:
max=20 open $(ls -Q)
all=1 open $(ls -Q)
다음은 하나의 라이너입니다.
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/mpeg
mime 파일의 기본 앱 이름을 "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
문제의 결과 앱이 새 인스턴스에서 모든 파일을 열 수 있으므로 여러 가지 방법으로 추악해질 수 있습니다.
이 명령들을 사용할 수 있습니다
cd /path/to/source_folder
find . -type f -name *.mp3 -exec vlc {} \+
음악 플레이어가 여러 파일을 명령 줄 인수로 지원하는 경우에만 가능합니다. vlc
선택한 음악 플레이어로 교체하십시오 .
이것은 내 테스트에서 RhythmBox 및 VLC와 함께 작동합니다.
find
... -exec
각 파일에서 개별 명령을 실행 하지 않습니까? 또한 음악 플레이어가 여러 파일을 명령 줄 인수로 지원하는 경우을 사용할 수 있습니다 vlc *.mp3
.
\+
끝
find
하드 코딩 할 경우 사용 하는 것이 의미가 없는 것 같습니다 vlc
. (질문은 모두 한 디렉토리에 있음을 시사합니다.)
+
, 필요 충분하지 않습니다 \+
.
xdg-open
실제로 기본적 으로이 작업을 수행 할 수 있어야합니다 ... 인수 목록을 프로그램에 전달하십시오. freedesktop.org 사람들과 함께하십시오! :-)