快速列出Linux目录中的随机文件集

时间:2018-11-29 14:20:16

标签: linux bash unix

问题: 我正在寻找一种高性能,简洁的方法,仅使用Bash在Linux目录中列出 N 个随机选择的文件。必须从不同的子目录中随机选择文件。

为什么要问: 在Linux中,我经常想测试目录中某个属性的随机选择。该目录包含1000个文件,因此我只想测试其中的一小部分,但是我想从感兴趣目录的不同子目录中获取它们。

以下内容返回50个“随机”选择的文件的路径:

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

该目录包含许多文件,并且驻留在读取速度较慢(通过ssh访问)的已安装文件系统上,因此该命令可能需要花费几分钟。我相信问题在于第一个find命令会找到每个文件(速度很慢),然后才打印随机选择。

3 个答案:

答案 0 :(得分:2)

如果您定期使用locateupdatedb更新(可能是默认的每日更新),则可以:

$ 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

答案 1 :(得分:2)

您多久需要一次?提前定期进行工作,以在需要时迅速提供。

创建一个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 ~
  } &
}

答案 2 :(得分:0)

如果您无法运行定位并且find命令太慢,是否有任何理由必须实时完成?

是否可以使用cron将find命令的输出转储到文件中,然后从那里随机抽取?