如何切换到一个随机路径?

9 浏览
0 Comments

如何切换到一个随机路径?

我想要生成一个随机的已存在的路径来进行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}"),最后去重。

这应该可以工作,但是我需要生成很多随机的已存在路径,并希望存在更快的解决方案(这种生成可能需要很长时间,效果不错但有些不规范)。还有更好的想法吗?

0
0 Comments

文章标题:如何进入一个随机路径?

问题出现的原因:无法使用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的参数列表中移除".",但这样会使得随机性更加不完全。

0
0 Comments

问题的原因是作者不太熟悉bash,无法直接给出代码的答案。解决方法是通过一系列的步骤来实现。首先,使用ls命令来列出当前目录下的所有文件夹,然后从中随机选择一个文件夹。接着,再次使用ls命令来列出所选文件夹内的所有文件夹,再次随机选择一个文件夹。这样重复进行下去,直到选择到一个没有其他文件夹的文件夹为止。

如果希望有可能选择到包含其他文件夹的文件夹并停止在那里,可以在随机选择过程中增加一个选项,该选项有很小的概率发生,以停止在当前目录。

0
0 Comments

这段代码是用来实现在一个随机路径下进行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操作的功能。

0