Быстрый список случайного набора файлов в каталоге в Linux - PullRequest
0 голосов
/ 29 ноября 2018

Вопрос: Я ищу эффективный, краткий способ перечисления N случайно выбранных файлов в каталоге Linux с использованием только Bash.Файлы должны быть случайным образом выбраны из разных подкаталогов.

Почему я спрашиваю: В Linux я часто хочу проверить случайный выбор файлов в каталоге для какого-либо свойства.Каталоги содержат тысячи файлов, поэтому я хочу протестировать только небольшое их количество, но я хочу взять их из разных подкаталогов в интересующем каталоге.

Ниже приведены пути к 50 случайно выбранным файлам:

find /dir/of/interest/ -type f | sort -R | head -n 50

Каталог содержит много файлов и находится в смонтированной файловой системе с медленнойвремя чтения (доступ через ssh), поэтому команда может занять много минут.Я считаю, что проблема заключается в том, что первая команда find находит каждый файл (медленно) и только затем печатает случайный выбор.

Ответы [ 3 ]

0 голосов
/ 29 ноября 2018

Если вы не можете запустить locate и команда find слишком медленная, есть ли какая-то причина, по которой это нужно делать в реальном времени?

Можно ли использовать cron для вывода выходных данныхнайти команду в файл, а затем сделать случайный выбор оттуда?

0 голосов
/ 29 ноября 2018

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

Создайте скрипт refreshList.

#! /bin/env bash

find /dir/of/interest/ -type f | sort -R | head -n 50 >/tmp/rand.list
mv -f /tmp/rand.list ~

Поместите его в свой crontab.

0 7-20 * * 1-5 nice -25 ~/refresh

Тогда у вас всегда будет ~ / rand.list, которому меньше часа.

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

randFiles() {
  cat ~/rand.list
  {  find /dir/of/interest/ -type f |
       sort -R | head -n 50 >/tmp/rand.list
      mv -f /tmp/rand.list ~
  } &
}
0 голосов
/ 29 ноября 2018

Если вы регулярно используете locate и updatedb обновления (вероятно, по умолчанию ежедневно), вы можете:

$ locate /home/james/test | sort -R | head -5
/home/james/test/10kfiles/out_708.txt
/home/james/test/10kfiles/out_9637.txt
/home/james/test/compr/bar
/home/james/test/10kfiles/out_3788.txt
/home/james/test/test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...