我需要一种方法,我可以在for循环中使用mkdir
生成很多目录。
for i in $(seq 1 1 ${k})
do
mkdir ...
done
文件夹的名称是带有k
个数字的名称,例如0_0_1
,在这种情况下,k = 3。
for循环必须生成1
位置发生变化的不同名称。所以生成的名称和创建的目录应该是
1_0_0
,0_1_0
,0_0_1
并按此顺序排列。
这可能吗?
答案 0 :(得分:2)
纯粹的Bash解决方案(无需调用外部实用程序):提示archimiro 鼓励我在Bash循环中初始化数组。
# Determine the number of digits
k=3
# Create an array with the specified number of digits
# initialized to 0s (e.g., with k = 3, `( 0 0 0 )`).
arr=()
for (( i = 0; i < k; ++i )); do arr[i]='0'; done
# Loop over all digits and set each one to 1 in isolation.
IFS='_' # set IFS, the internal field separator, also used when printing arrays as strings
for (( i = 0; i < k; ++i )); do
arr[i]=1
# Inside "...", with index [*], the array elements are joined with
# the 1st char. in $IFS.
echo "${arr[*]}"
arr[i]=0
done
注意:为简洁起见,我省略了保存和恢复上面的原始$IFS
值,这是实际脚本中可取的。
以上产量:
1_0_0
0_1_0
0_0_1
答案 1 :(得分:1)
您可以使用循环创建第一个文件名,然后在循环中使用替换来创建其他名称:
#!/bin/bash
k=4
s=''
for ((i=1; i<k; i++)) ; do
s+=0_
done
s+=1
while [[ $s != 1* ]] ; do
echo "$s"
s=${s/0_1/1_0}
done
echo "$s"
答案 2 :(得分:1)
这是一个双重for循环,它将相应的名称打印到stdout
$ ./filemaker.sh
1_0_0_0
0_1_0_0
0_0_1_0
0_0_0_1
在k设置为4的情况下运行此脚本会得到输出
</li>
答案 3 :(得分:0)
这可能是最丑陋的方式,或者至少不是最快的方法。但无论如何它在这里:
k=3
template=$(printf "%0*d" "$k" | sed 's/./&_/g')
for ((i=1; i<=k*2; i+=2)); do
echo $(sed "s/./1/$i" <<<${template%_})
done
当然,我们可以尝试删除循环中的sed
以加快速度:
k=3
template=$(printf "%0*d" "$k" | sed 's/./&_/g')
for ((i=0; i<k*2; i+=2)); do
j=i+1
file=${template:0:$i}1${template:$j}
echo ${file%_}
done
答案 4 :(得分:0)
要为n
的任何值创建第一个模式,您可以使用bc
创建二进制数字,然后在_
的每个数字之间插入awk
:
$ n=5
$ fn=$(echo "obase=2;2^($n-1)" | bc | awk '$1=$1' FS= OFS="_" )
$ echo "$fn"
1_0_0_0_0
然后,您可以在Bash循环中使用awk
旋转该模式。这里有一个更大的n
来演示:
n=7
fn=$(echo "obase=2;2^($n-1)" | bc | awk '$1=$1' FS= OFS="_" )
for (( i=1 ; i<=$n ; i++ )); do
(( i > 1 )) && fn=$(echo "$fn" | awk '{t=$(n-1); $(n-1)=$n; $n=t; print }' n="$i" FS="_" OFS="_")
echo "$fn" # here mkdir "$fn"
done
1_0_0_0_0_0_0
0_1_0_0_0_0_0
0_0_1_0_0_0_0
0_0_0_1_0_0_0
0_0_0_0_1_0_0
0_0_0_0_0_1_0
0_0_0_0_0_0_1