我想生成一个到cd
的随机现有路径并在其中写入文件,如果可能的话,从指定的根目录中随机出现(这一点可以像cd /home/foobar/$RANDOM
一样使用)。
根据ls command: how can I get a recursive full-path listing, one line per file?
,我认为我可以通过使用ls和awk列出所有路径来执行此操作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 :(得分:2)
find
+ sort -R
的另一种变体:
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
答案 1 :(得分:1)
我对bash不太熟练,所以我不会给你一个直接的编码答案,但是你可以在这里找到答案。
根据我的理解,您使用1 ls
命令列出整个文件系统。
那需要很长时间。相反,使用ls
仅列出当前目录中的文件夹,选择一个随机文件夹,然后对您选择的文件夹执行相同操作。
这可能会持续到你进入一个里面没有文件夹的文件夹。
如果您希望选择包含其他文件夹的文件夹并停在那里,请在随机选择中包含一个不会选择任何文件并在当前目录中停止的选项。该选项的发生概率很小。
答案 2 :(得分:1)
这是一次快速而肮脏的尝试。
randomcd () {
local p=$(printf '%s\n' . */ | sort -R | head -n 1)
case $p in '.' | '*/') pwd; return;; esac
( cd "$p"; randomcd )
}
不幸的是sort -R
并非完全可移植。如果你也没有shuf
,那么这样的事情可能有用:
shuffle () {
perl -MList::Util -e 'print List::Util::shuffle <>'
}