Странно ... это должно быть частью coreutils. Если ваш coreutils старый, то команды там не будет.
Ренан
6
Это быстрый и грязный способ, и я бы тоже его использовал - для одноразового сценария. Для чего-либо более долговечного, избегайте анализа выводаls .
Янмезен
@janmoesen Я не знал об этом. Благодарность!
Ренан
@Renan Не каждый Unix имеет GNU coreutils, установленный по умолчанию.
Кусалананда
2
Это довольно легко решить с помощью чуть-чуть Perl. Выберите четыре файла случайным образом из текущего каталога:
perl -MList::Util=shuffle -e 'print shuffle(`ls`)'| head -n 4
Однако для производственного использования я бы пошел с расширенным сценарием, который не полагается на lsвывод, может принять любой dir, проверить ваши аргументы и т. Д. Обратите внимание, что сам случайный выбор по-прежнему состоит всего из нескольких строк.
#!/usr/bin/perl use strict;use warnings;useList::Util qw( shuffle );if(@ARGV<2){die"$0 - List n random files from a directory\n"."Usage: perl $0 n dir\n";}my $n_random = shift;my $dir_name = shift;
opendir(my $dh, $dir_name)||die"Can't open directory $dir_name: $!";# Read in the filenames in the directory, skipping '.' and '..'my@filenames= grep {!/^[.]{1,2}$/} readdir($dh);
closedir $dh;# Handle over-specified inputif( $n_random > $#filenames ) {print"WARNING: More values requested ($n_random) than available files (".@filenames.") - truncating list\n";
$n_random =@filenames;}# Randomise, extract and print the chosen filenamesforeachmy $selected ((shuffle(@filenames))[0..$n_random-1]){print"$selected\n";}
Imho Perl-скрипт не является «стандартной командой Unix». Эту проблему легко решить с помощью любого языка сценариев высокого уровня, такого как Perl, Python или Ruby, но она более интересна, если она непосредственно в командной строке.
Gerrit
1
@gerrit - я понимаю твою точку зрения. Я предоставил это, потому что предпочтительный ответ (использование shuf) не был достаточен для OP. Что касается и не является стандартным Unix - Perl существует повсюду, и он решает проблему кратко и надежно. Если бы я дал это как однострочник Perl, это бы считалось «командной строкой»? Является ли тот факт, что Perl является мощным аргументом против существования этого ответа?
ire_and_curses
Я бы сказал, что это ответ на другой вопрос. Конечно, на любом полнофункциональном языке программирования эта проблема тривиальна, для меня интересная часть вопроса заключается в том, можно ли это сделать / без / прибегая к сценарию ~ 20 LOC; языки сценариев являются мощными, но я не думаю, что Perl классифицирует как команду (такую, как запрашивал OP; и нет, если бы вы дали 200-символьную командную строку для вызова Perl, я бы имел такое же мнение).
геррит
@gerrit - Возможно, я могу быть более ясным. Посмотрите на мое редактирование: perl -MList::Util=shuffle -e 'print shuffle(Ls )' | head -n 4Это больше похоже на то , что вы искали?
ire_and_curses
Да, я удалил свое пониженное голосование, которое по общему признанию было немного резким.
Это может перечислить один и тот же файл более одного раза. Избежать этого - значительная часть проблемы.
Жиль "ТАК - перестань быть злым"
Жиль: совершенно верно, поэтому я сказал: «Обратите внимание, что ни одна из версий не учитывает дубликаты». Вы все еще можете сделать это в чистом Bash, если вам не нужны временные сложности и перестраивать массив каждый раз, когда вы удаляете из него случайный. Даже близко не к одной строчке, но, конечно, это не было требованием.
Ответы:
Поскольку вы упоминаете Zsh:
Вы можете заменить,
print
скажем,ogg123
и*
сказать**/*.ogg
источник
Попробуйте передать
ls
выводshuf
, например,-n
Флаг определяет , сколько случайных файлы , которые вы хотите.источник
command not found
(не установлено): /ls
.Это довольно легко решить с помощью чуть-чуть Perl. Выберите четыре файла случайным образом из текущего каталога:
Однако для производственного использования я бы пошел с расширенным сценарием, который не полагается на
ls
вывод, может принять любой dir, проверить ваши аргументы и т. Д. Обратите внимание, что сам случайный выбор по-прежнему состоит всего из нескольких строк.источник
shuf
) не был достаточен для OP. Что касается и не является стандартным Unix - Perl существует повсюду, и он решает проблему кратко и надежно. Если бы я дал это как однострочник Perl, это бы считалось «командной строкой»? Является ли тот факт, что Perl является мощным аргументом против существования этого ответа?perl -MList::Util=shuffle -e 'print shuffle(
Ls)' | head -n 4
Это больше похоже на то , что вы искали?Простое решение, которое позволяет избежать анализа ls, а также работает с пробелами:
источник
shuf
.shuf
не упоминается в вопросе. Этот ответ по-прежнему будет полезен для других пользователей.Онлайнер, использующий только Zsh:
То же самое в Bash, где индексы массива начинаются с нуля:
Обратите внимание, что ни одна из версий не учитывает дубликаты.
источник