如何切换到一个随机路径?
如何切换到一个随机路径?
我想要生成一个随机的已存在的路径来进行cd
和在其中写文件,如果可能的话从指定的根目录开始随机生成(关键是可以像cd /home/foobar/$RANDOM
一样使用)。
我认为我可以通过使用ls和awk命令列出所有路径来实现这一点,根据ls命令:如何获得递归的完整路径列表,每行一个文件?
ls -R /path | awk ' /:$/&&f{s=$0;f=0} /:$/&&!f{sub(/:$/,"");s=$0;f=1;next} NF&&f{ print s"/"$0 }'
然后将每行结果传递给$(dirname "${LINE_FILE}")
,最后去重。
这应该可以工作,但是我需要生成很多随机的已存在路径,并希望存在更快的解决方案(这种生成可能需要很长时间,效果不错但有些不规范)。还有更好的想法吗?
文章标题:如何进入一个随机路径?
问题出现的原因:无法使用sort -R命令进行排序,此命令不完全可移植。如果没有shuf命令,可以尝试使用类似perl -MList::Util的方法进行排序。
解决方法:
1. 使用randomcd函数:此函数通过使用sort -R命令对当前目录下的子目录进行排序,然后选择第一个目录进行进入。如果只有当前目录和子目录,则返回当前目录。如果sort -R命令不可用,可以尝试使用shuffle函数。
2. 使用shuffle函数:此函数通过使用perl -MList::Util命令对输入进行洗牌操作,然后输出结果。这样可以实现随机排序。
代码如下:
randomcd () { local p=$(printf '%s\n' . */ | sort -R | head -n 1) case $p in '.' | '*/') pwd; return;; esac ( cd "$p"; randomcd ) } shuffle () { perl -MList::Util -e 'print List::Util::shuffle <>' }
注意:如果想要总是进入一个叶子目录,可以从printf的参数列表中移除".",但这样会使得随机性更加不完全。
这段代码是用来实现在一个随机路径下进行cd操作的。其中使用了find命令和sort命令来生成一个随机路径,并将该路径赋值给变量directory。然后通过循环来不断生成随机路径,直到找不到符合条件的路径为止。最后将得到的路径赋值给变量endPath,并使用cd命令进入该路径。
然而,在这段代码中存在一些问题。首先,在使用echo命令时,使用了反引号包裹命令。这是一种不必要的用法,因为反引号已经被废弃,可以直接使用$()来替代。其次,如果变量$directory中包含了一些echo -e会解释为转义代码的内容,那么最终输出的字符串就会出错。此外,使用<<<来提供输入的目的是为了能够简单地使用<<<"$directory"来替代。最后,还进行了一些编辑来删除命令替换中剩余的echo命令,因为这种反模式会加剧任何引号问题,并且原代码中存在多个这样的问题。
为了解决这些问题,我们可以对代码进行如下修改:
startDir='/your/path' maxPathRange=10 endPath=$startDir for (( i=1; i<=((1 + RANDOM % $maxPathRange)); i++ )); do directory=$(find "$endPath" -maxdepth 1 -type d ! -path "$endPath" -printf "%f\n" | sort -R | head -n 1) if [[ -z $directory ]]; then break; fi endPath=$endPath/$directory done <<< "$directory" cd "$endPath" && pwd
通过使用$()来替代反引号,使用<<<"$directory"来替代<<<"$directory",并删除多余的echo命令,我们可以修复原代码中存在的问题,并实现在随机路径下进行cd操作的功能。