
응용 프로그램이 명령줄 인수를 통해서만 파일을 열 수 있다고 가정하면 이를 수행하기 위해 파일 이름/경로 목록을 무작위로 지정하는 방법은 무엇입니까?
나는 이것이 매우 쉬울 것이라고 생각했지만 분명히 공간이 필요한 것보다 더 복잡하게 만듭니다.
예:
a.mp3
b.mp3
with space.mp3
내가 시도하면 $(ls | shuf)
공간이 탈출되지 않아 다음과 같은 결과가 나옵니다 with space.mp3 b.mp3 a.mp3
.
quote 옵션을 사용해 -Q
도 도움이 되지 않습니다. 왜냐하면 명령 대체가 따옴표를 이스케이프하여 다음 결과를 초래하기 때문입니다.\"with space.mp3\" \"a.mp3\" \"b.mp3\"
마찬가지로 get 이스케이프 -b
도 마찬가지입니다.with\\ space.mp3 a.mp3 b.mp3
검색 결과가 없으면 와 같은 것이 완벽할 것 find
입니다 ...-exec <application> {} \+
답변1
ls
다음은 다음 을 제거하는 zsh 전용 변형입니다 shuf
.
mplayer *.mp3(oe:REPLY=\$RANDOM:)
Glob 한정자는 두 콜론( ) 사이의 코드를 o
실행( )합니다 . 그러면 코드는 모든 파일에 의사 난수를 할당하여 임의의 순서를 만듭니다.e
:
$RANDOM
명령을 좀 더 모호하게 하기 위해(주로 키 입력을 저장하기 위해) 쉘 함수를 정의할 수 있습니다 s
.
s() { REPLY=$RANDOM }
mplayer *.mp3(oe:s:)
CTRL+R
또는 더 나은 방법은 셔플 부분에 대해 키 바인딩을 정의하는 것입니다 .
bindkey -s '^R' '(oe:REPLY=\\$RANDOM:)^M'
이제 mplayer *.mp3
뒤에 만 입력하면 CTRL+R
해당 (oe:REPLY=\$RANDOM:)
부분이 추가되고 명령줄이 즉시 실행됩니다( ^M
).
답변2
ls
전혀 필요하지 않습니다 . 노력하다
mplayer "${(f)$(shuf -e *.mp3)}"
문제는 ls
종종 다음과 같은 별칭으로 지정되며 ls --color=always
이 경우 다른 프로그램에서 제대로 인식되지 않는 보이지 않는 문자를 인쇄한다는 것입니다( shuf
이 예에서는).
답변3
마침내 방법을 알아낸 것 같아요.${(f)"$(ls | shuf)"}
고장:
ls | shuf
: 예상대로 파일/디렉터리를 섞습니다.
"$(...)"
: 따옴표는 개행 문자를 포함하여 출력을 그대로 유지합니다.
${(f)...}
: 개행 문자에서 확장 결과를 분할하여 파일/디렉터리 이름의 배열을 생성합니다.
"${(f)$(ls | shuf)}"
마찬가지로 작동하지만 ${(f)$(ls | shuf)}
, 작동하지 않습니다.