在for循环中创建文件名

时间:2017-06-24 20:05:29

标签: bash

我需要一种方法,我可以在for循环中使用mkdir生成很多目录。

for i in $(seq 1 1 ${k})
do
   mkdir ...
done

文件夹的名称是带有k个数字的名称,例如0_0_1,在这种情况下,k = 3。

for循环必须生成1位置发生变化的不同名称。所以生成的名称和创建的目录应该是

对于k = 3,

1_0_00_1_00_0_1

并按此顺序排列。

这可能吗?

5 个答案:

答案 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