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

Вы можете попробовать поместить код AJAX в функцию setTimeout, если бэкэнд работает слишком быстро.

setTimeout(function(){
    // put here your AJAX
}, 2000); // 2 seconds delay
46
задан JasonSmith 31 March 2009 в 17:52
поделиться

4 ответа

files=(/my/dir/*)
printf "%s\n" "${files[RANDOM % ${#files[@]}]}"

И не анализируйте ls. Прочитайте http://mywiki.wooledge.org/ParsingLs

Править: Удача, находящая не -bash решение это надежно. Большинство повредится для определенных типов имен файлов, таких как имена файлов с пробелами или новыми строками или тире (это в значительной степени невозможно в чистом sh). Сделать его правильно без bash, необходимо было бы полностью мигрировать на awk/perl/python/... не передавая по каналу, которые производят для последующей обработки или такого.

59
ответ дан Gilles 'SO- stop being evil' 26 November 2019 в 20:17
поделиться

Что-то как:

let x="$RANDOM % ${#file}"
echo "The randomly-selected file is ${path[$x]}"

$RANDOM в ударе специальная переменная, которая возвращает случайное число, затем я использую подразделение модуля для получения допустимого индекса, затем ссылка, которые индексируют в массиве.

3
ответ дан harperville 26 November 2019 в 20:17
поделиться

Я думаю, что Awk является хорошим инструментом для получения случайного числа. Согласно Усовершенствованному Руководству Bash, Awk является хорошей заменой случайного числа для $RANDOM.

Вот версия Вашего сценария, который избегает инструменты GNU и измы Bash.

#! /bin/sh

dir='some/directory'
n_files=`/bin/ls -1 "$dir" | wc -l | cut -f1`
rand_num=`awk "BEGIN{srand();print int($n_files * rand()) + 1;}"`
file=`/bin/ls -1 "$dir" | sed -ne "${rand_num}p"`
path=`cd $dir && echo "$PWD/$file"` # Converts to full path.  
echo "The randomly-selected file is: $path"

Это наследовало проблемы, которые упомянули другие ответы, должен файлы содержать новые строки.

2
ответ дан ashawley 26 November 2019 в 20:17
поделиться

Это сводится к: Как я могу создать случайное число в сценарии Unix портативным способом?

Поскольку, если у Вас есть случайное число между 1 и N, можно использовать head -$N | tail сократить где-нибудь в середине. К сожалению, я не знаю портативного способа сделать это с одной только оболочкой. Если у Вас есть Python или Perl, можно легко использовать их случайную поддержку, но AFAIK, нет никакого стандарта rand(1) команда.

2
ответ дан Aaron Digulla 26 November 2019 в 20:17
поделиться