我需要一种方法,我可以在for循环中使用mkdir
生成很多目录。在for循环中创建文件名
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
对于k = 3
和以该顺序为好。
这可能吗?
我需要一种方法,我可以在for循环中使用mkdir
生成很多目录。在for循环中创建文件名
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
对于k = 3
和以该顺序为好。
这可能吗?
您可以使用一个循环来创建的第一个文件名,然后使用替代在循环中创建其他名称:
#!/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"
我不确定角色subtitiution工程...可以做的其他方式? –
@mastersplinter:你运行的是什么版本的bash? – choroba
这里是一个循环,将打印相应的名称到标准输出双
k=4
for i in $(seq 1 1 ${k})
do
name="0"
if [[ "$i" -eq "1" ]]; then
name="1"
fi
for j in $(seq 2 1 ${k})
do
if [[ "$i" -eq "$j" ]]; then
name="${name}_1"
else
name="${name}_0"
fi
done
echo "$name" #to make directories replace with mkdir "$name"
done
运行此脚本,其中k设置为4给出了输出
$ ./filemaker.sh
1_0_0_0
0_1_0_0
0_0_1_0
0_0_0_1
这可能是最丑陋的方式去做,或者至少不是最快的方式。不过,无论如何这里有云:
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
纯巴什解决方案(外部公用事业无呼叫) :顶一下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
要创建第一个模式为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
所以对于'K = 4'你将有'1_0_0_0 0_1_0_0 0_0_1_0 0_0_0_1'? – dawg