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)
这是一个生成随机目录结构的脚本:
#!/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文件.你有足够的例子来做到这一点.我做了最辛苦的工作.
我对给出的答案不太满意,所以我想出了自己的答案。以下内容获取我的输入文件,并使用 /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)