Выбор случайного файла от каждой подпапки

Из-за опасности звучания ненормальным, почему не только используют PuTTY? Если Вам уже нравится функциональность, она дает Вам, просто выполните ее. PuTTY доступен для Linux или Windows

Как уже говорилось в комментариях, telnet не является сырыми данными - это ожидает, что будут сопровождаться определенные протоколы.

2
13.04.2017, 15:36
2 ответа

Это не расширение y, но значение, присваиваемое y это - проблема.

У Вас есть это

y=$($x/*(o+rand[1]))

Присваиваемое значение является результатом замены команды ($(…)). Единственное “слово” в команде, которой заменяют, является выражением шарика. Это означает, что попытается выполнить выбранный файл как команду (который, вероятно, вызовет ошибку и не произведет полезного вывода).

Чтобы заставить это работать (хотя с изменением в семантике), можно изменить присвоение замены команды в присваивание массива (т.е. удалить $ после =):

y=($x/*(o+rand[1]))

Если Вы хотите сохранить замену команды, необходимо заставить ее произвести выбранный путь вместо того, чтобы пытаться выполнить ее как команду:

y=$(print -- $x/*(o+rand[1]))

Но здесь существует скрытая проблема. Каждый шарик будет оценен в отдельной подоболочке, таким образом, каждый каталог будет использовать ту же последовательность случайных чисел для сортировки ее записей. Можно наблюдать это, если Вы используете set -x и посмотрите на последовательность значений, присваиваемых для ОТВЕТА для каждого каталога. Это означает, что файлы не будут выбраны независимо через каталоги.

Вот некоторые альтернативные подходы, которые можно использовать для присвоения расширения шарика на параметр (они сохраняют $RANDOM оценка в той же оболочке, таким образом, выборы будут (более) независимыми):

for y in $x/*(o+rand[1]); do print -- ${y:r}; done
set -- $x/*(o+rand[1]); print -l -- ${@:r}

Если Вы хотите обработать пустые каталоги, то необходимо, вероятно, добавить N спецификатор шарика (действует, как будто NULL_GLOB были установлены). Это также поможет обработать некаталоги, которые соответствуют внешнему шарику (хотя Вы могли использовать / спецификатор шарика для ограничения того одного просто каталогами).

rand() REPLY=$RANDOM
for x in *(/); do y=($x/*(No+rand[1])); print -l -- ${y:r}; done
2
27.01.2020, 21:57

Можно добавить модификаторы к globbing спецификаторам:

for x (*(/)) print -rl -- $x/*(No+rand[1]:r)

См. также:

print -rl -- *(N/e{'REPLY=($REPLY/*(No+rand[1]:r))'})
3
27.01.2020, 21:57

Теги

Похожие вопросы