Argumentos de nome de arquivo aleatório no zsh

1

Suponha que o aplicativo possa apenas abrir arquivos através de argumentos de linha de comando, como eu poderia randomizar uma lista de nomes de arquivos / caminhos para realizar isso?

Eu pensei que isso deveria ser bastante fácil, mas aparentemente os espaços tornam isso mais complicado do que deveria ser.

Um exemplo:

a.mp3
b.mp3
with space.mp3

Quando eu tento $(ls | shuf) , o espaço não é ignorado, gerando algo como with space.mp3 b.mp3 a.mp3 .

A utilização da opção de cotação -Q também não ajuda, porque a substituição do comando escapa das aspas, resultando no seguinte: \"with space.mp3\" \"a.mp3\" \"b.mp3\"

Da mesma forma, as fugas de -b também escaparam: with\ space.mp3 a.mp3 b.mp3

Algo como find ' -exec <application> {} \+ sem a descoberta seria perfeito ...

    
por H.B. 31.08.2014 / 18:48

3 respostas

3

Aqui está uma variante somente para zsh, livrando-se de ls e shuf :

mplayer *.mp3(oe:REPLY=\$RANDOM:)

O Qualificador de Globo o executa ( e ) o código entre os dois-pontos ( : ). O código, por sua vez, atribui a cada arquivo um número pseudo-aleatório $RANDOM , resultando em uma ordem arbitrária.

Para obscurecer o comando um pouco mais, mas principalmente para salvar pressionamentos de tecla, você pode definir uma função de shell s :

s() { REPLY=$RANDOM }
mplayer *.mp3(oe:s:)

Ou, melhor ainda, definir uma ligação de chave, por ex. para CTRL+R da parte aleatória:

bindkey -s '^R' '(oe:REPLY=\$RANDOM:)^M'

Agora, digite apenas mplayer *.mp3 seguido por CTRL+R , e a parte (oe:REPLY=\$RANDOM:) será anexada e a linha de comando será executada imediatamente ( ^M ).

    
por 02.09.2014 / 19:06
5

Você não precisa de ls . Experimente

mplayer "${(f)$(shuf -e *.mp3)}"

O problema com ls é que muitas vezes ele é alias a algo como ls --color=always e, nesse caso, imprime caracteres invisíveis que não são reconhecidos corretamente por outros programas ( shuf neste exemplo).

    
por 02.09.2014 / 03:37
0

Acho que finalmente descobri um método: ${(f)"$(ls | shuf)"}

Divisão:

ls | shuf : arquivos aleatórios / dirs conforme o esperado.
"$(...)" : As cotações mantêm a saída como está, incluindo novas linhas.
${(f)...} : Divide o resultado da expansão em novas linhas gerando uma matriz dos nomes de arquivos / pastas.

"${(f)$(ls | shuf)}" funciona também, ${(f)$(ls | shuf)} , não funciona.

    
por 31.08.2014 / 19:52