Лучший способ выбрать случайный файл из каталога в сценарии оболочки - PullRequest
44 голосов
/ 31 марта 2009

Каков наилучший способ выбрать случайный файл из каталога в сценарии оболочки?

Вот мое решение на Bash, но я был бы очень заинтересован в более переносимой (не GNU) версии для использования на собственно Unix.

dir='some/directory'
file=`/bin/ls -1 "$dir" | sort --random-sort | head -1`
path=`readlink --canonicalize "$dir/$file"` # Converts to full path
echo "The randomly-selected file is: $path"

У кого-нибудь есть еще идеи?

Редактировать: lhunath хорошо подходит для анализа ls. Я думаю, все сводится к тому, хотите ли вы быть портативным или нет. Если у вас есть GNU findutils и coreutils, вы можете сделать:

find "$dir" -maxdepth 1 -mindepth 1 -type f -print0 \
  | sort --zero-terminated --random-sort \
  | sed 's/\d000.*//g/'

Уфф, это было весело! Также это лучше соответствует моему вопросу, так как я сказал «случайный файл». Честно говоря, в наши дни трудно представить систему Unix, развернутую там с установленным GNU, но не с Perl 5.

Ответы [ 11 ]

0 голосов
/ 16 февраля 2016

Поместите каждую строку вывода команды 'ls' в ассоциативный массив с именем line, а затем выберите один из них, например так ...

ls | awk '{ line[NR]=$0 } END { print line[(int(rand()*NR+1))]}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...