1

Предположим, что приложение может открывать файлы только с помощью аргументов командной строки. Как бы мне было рандомизировать список имен файлов / путей для достижения этой цели?

Я думал, что это должно быть довольно легко, но, видимо, пробелы делают его более сложным, чем должно быть.


Пример:

a.mp3
b.mp3
с пробелом .mp3

Когда я пытаюсь $(ls | shuf) пробел не экранируется, получая что-то вроде with space.mp3 b.mp3 a.mp3 .

Использование опции цитаты -Q также не помогает, потому что подстановка команды экранирует кавычки, что приводит к следующему: \"with space.mp3\" \"a.mp3\" \"b.mp3\"

Аналогично, экранированные символы -b экранируются: with\\ space.mp3 a.mp3 b.mp3

Что-то вроде find 's -exec <application> {} \+ без поиска было бы идеальным ...

3 ответа3

5

Тебе совсем не нужен ls . Пытаться

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

Проблема с ls заключается в том, что он часто ассоциируется с чем-то вроде ls --color=always и в этом случае печатает невидимые символы, которые не распознаются другими программами должным образом (в этом примере shuf ).

3

Вот вариант только для zsh, избавляющий от ls и 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).

0

Я думаю, что я наконец-то понял метод: ${(f)"$(ls | shuf)"}

Сломать:

ls | shuf: перемешать файлы / каталоги, как ожидалось.
"$(...)": в кавычках сохраняется вывод, как есть, включая переводы строк.
${(f)...}: разбивает результат раскрытия на новые строки, получая массив имен файлов / каталогов.


"${(f)$(ls | shuf)}" работает, ${(f)$(ls | shuf)} - нет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .