Linux:创建随机目录/文件层次结构

And*_*ohr 8 linux bash shell command-line-interface

为了测试工具,我需要一个目录,其中包含深层嵌套结构中的一大堆不同的Office文件.我已将文件放在目录中,但现在需要创建一些随机嵌套的子目录并将其中的文件展开.

我可以坐下来用我选择的编程语言编写一个合适的程序,但我想知道是否有一个聪明的Linux命令行工具组合+ Bash来实现我想要的.

编辑:澄清一下,我的输入是一个包含大约200个文件的目录.输出应该是一个目录层次结构,包含或多或少均匀分布的这些文件.目录名称不应超过单个字母,长度随机变化,并使用各种允许的字符(utf-8文件系统).

kev*_*kev 10

你可以使用bash brace-expansion:

mkdir -p {a,b}/{e,f,g}/{h,i,j}
Run Code Online (Sandbox Code Playgroud)
????a
?   ????e
?   ?   ????h
?   ?   ????i
?   ?   ????j
?   ????f
?   ?   ????h
?   ?   ????i
?   ?   ????j
?   ????g
?       ????h
?       ????i
?       ????j
????b
    ????e
    ?   ????h
    ?   ????i
    ?   ????j
    ????f
    ?   ????h
    ?   ????i
    ?   ????j
    ????g
        ????h
        ????i
        ????j
Run Code Online (Sandbox Code Playgroud)


Gil*_*not 8

这是一个生成随机目录结构的脚本:

#!/bin/bash

# Decimal ASCII codes (see man ascii)
ARR=( {48..57} {65..90} {97..122} )

# Array count
arrcount=${#ARR[@]}

# return a random string
get_rand_dir(){
    for ((i=1; i<$((RANDOM%30)); i++)) {
        printf \\$(printf '%03o' ${ARR[RANDOM%arrcount]});
    }
}

dir=/tmp/

# appending random characters to make a hierarchy
for ((i=0; i<$((RANDOM%100)); i++)) {
    dir+="$(get_rand_dir)/"
}

echo $dir
mkdir -p "$dir"

oldir=$(echo "$dir" | cut -d '/' -f1-3)

while [[ $dir ]]; do
    dir=${dir%/*}
    cd $dir
    for ((i=0; i<$((RANDOM%100)); i++)) {
        mkdir &>/dev/null -p $(get_rand_dir)
    }
done

tree "$oldir"
Run Code Online (Sandbox Code Playgroud)

OUTPUT

/tmp/x
??? egeDVPW
??? iOkr
??? l
??? o1gye8uF
??? q
?   ??? 4Dlrfagv
?   ??? 4Yxmoqf
?   ??? 8LkyIrXA
?   ??? 8m9kse8s
?   ??? aV
?   ??? in
?   ?   ??? 12zdLso68HWlPK
?   ?   ?   ??? C
?   ?   ?   ??? DOYt8wUW
?   ?   ?   ??? FXP
?   ?   ?   ??? hFLem8
?   ?   ?   ??? hhHIv
?   ?   ?   ??? iD87kxs54x04
?   ?   ?   ??? oFM
?   ?   ?   ??? OjFT
Run Code Online (Sandbox Code Playgroud)

现在您可以创建一个dirs数组:

shopt -s globstar # require bash4
dirs=( /tmp/x/** )
printf '%s\n' ${dirs[@]}
Run Code Online (Sandbox Code Playgroud)

并随机填充dirs文件.你有足够的例子来做到这一点.我做了最辛苦的工作.


And*_*ohr 1

我对给出的答案不太满意,所以我想出了自己的答案。以下内容获取我的输入文件,并使用 /dev/urandom 收集 10 到 256 个可打印字符,放入更多目录分隔符,创建目录层次结构并在其中放置一个文件。

使用 urandom 会创建一些非常奇怪的目录名称,这对我的目的很有好处。我确信真正的 Unix 大师可以进一步简化这个过程。例如,目录构建可能可以通过单个 awk 命令完成。

#!/bin/bash
INDIR='files';

IFS=$'\n'
for FILE in `ls $INDIR/*`; do
    DIR=`cat /dev/urandom | \
         tr -dc '[ -~]' | \
         tr 'ABCDEF\\\\' '///////' | \
         head -c$((10 + $RANDOM % 256))`

    mkdir -p $DIR
    cp $FILE $DIR
done
Run Code Online (Sandbox Code Playgroud)