zsh에서 파일 이름 인수 섞기

zsh에서 파일 이름 인수 섞기

응용 프로그램이 명령줄 인수를 통해서만 파일을 열 수 있다고 가정하면 이를 수행하기 위해 파일 이름/경로 목록을 무작위로 지정하는 방법은 무엇입니까?

나는 이것이 매우 쉬울 것이라고 생각했지만 분명히 공간이 필요한 것보다 더 복잡하게 만듭니다.


예:

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)}, 작동하지 않습니다.

관련 정보