【发布时间】:2009-03-31 15:12:36
【问题描述】:
在 shell 脚本中从目录中选择随机文件的最佳方法是什么?
这是我在 Bash 中的解决方案,但我非常有兴趣在 Unix 上使用更便携(非 GNU)的版本。
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。
【问题讨论】:
-
bash 方式将使用 $(...) 而不是
...。 -
好点。我有点不清楚。在实践中,我在 Linux 上使用 Bash,但理论上如果它在 Unix 上的 sh 上运行会很酷,这意味着反引号并且没有 GNU coreutils。
-
@JasonSmith
$(…)在 POSIX 中。如果您仍然有一个不支持它的外壳,请将/usr/xpg4/bin或类似的东西放在/usr/bin前面,然后调用/usr/bin/env sh而不是/bin/sh。 (否则你经营的是真正的古董。)