从shell脚本中的目录中选择一个随机文件的最好方法是什么?
这里是我在Bash的解决方案,但我会非常感兴趣的一个更便携的(非GNU)版本在Unix适当使用。
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/'
哇,那很有趣!它也匹配我的问题更好,因为我说“随机文件”。 Honsetly虽然,这些天很难想象一个Unix系统部署有安装GNU但不是Perl 5。
files=(/my/dir/*) printf "%s\n" "${files[RANDOM % ${#files[@]}]}"
并且不解析ls。阅读http://mywiki.wooledge.org/ParsingLs
编辑:祝你好运找到一个非bash解决方案是可靠的。大多数会破坏某些类型的文件名,例如带空格或换行符或破折号的文件名(在纯sh中几乎不可能)。要做到正确没有bash,你需要完全迁移到awk / perl / python / …没有管道输出进一步处理等。