2017-05-18 1 views
1

ランダムな既存のパスをcdに生成し、可能であれば指定されたルートからファイルを書き込もうとします(そのポイントはcd /home/foobar/$RANDOMのように使用できます)。ランダムパスにcdするには?

私はls command: how can I get a recursive full-path listing, one line per file?

ls -R /path | awk ' 
/:$/&&f{s=$0;f=0} 
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next} 
NF&&f{ print s"/"$0 }' 

そしてdupesをパージすることによって$(dirname "${LINE_FILE}")、仕上げにラインあたりの結果行を与えるによると、このコマンドを使用して、LSとのawkですべてのパスをリストすることによって、これを行うことができると思います。

これはうまくいくはずですが、既存の多くのパスを生成する必要があり、より早い解決策が存在することを願っています(この世代はかなり時間がかかるかもしれませんが、汚いです)。どんな良いアイデアですか?

+1

「workyけど汚い」これは十字軍の王のようなものだ私の新しいお気に入りのフレーズ – SpoonMeiser

+1

ですII、時には最悪の場合がベストかもしれません。 – sh5164

答えて

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 
+2

それはあなたがそこに持っている大量の[backticksでのエコー](http://www.iki.fi/era/unix/award.html#echo)です。 '$ directory'の値に' echo -e'がエスケープコードとして解釈するものが含まれていると、それは間違った文字列になります。とにかく、 '<<<'の目的は単に '<<<" $ directory "'と言うことができるからです。 – tripleee

+0

はい、そうです。私は自分のメッセージを編集する。ありがとう。 – beliy

+0

コマンド置換の残りの 'echo'も削除するように編集しました。それは反論を悪化させる反イディオムであり、いくつかの問題があります。 – tripleee

1

私はbashにあまり堪能ではないので、私はあなたにまっすぐにコード化された答えを与えるつもりはありませんが、ここでそれを達成する方法があります。

ファイルシステム全体を表示するには、1 lsコマンドを使用しています。

これには時間がかかります。代わりに、lsを使用して、現在のディレクトリ内のフォルダのみを一覧表示し、ランダムなものを選択してから、同じものを選択します。

これは、フォルダがないフォルダに移動するまで続きます。

他のフォルダを含むフォルダを選択して停止する可能性がある場合は、ランダムピッキングにファイルを選択せず​​に現在のディレクトリで停止するオプションを含めます。このオプションは発生する可能性が低いはずです。

+0

いいえ、[ls'出力を解析しません](http://mywiki.wooledge.org/ParsingLs)。 – tripleee

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 <>' 
} 
+1

リーフディレクトリに常に 'cd'したいが' '' printf''引数リストから '.'を削除することができます。 – tripleee

関連する問題