2017-06-24 268 views
2

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

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

文件夹的名称是用k号码,如0_0_1一个名称在这种情况下,K = 3。

的for循环具有产生不同的名称,其中的1的位置改变。如此产生的名称和目录中创建应

1_0_00_1_00_0_1对于k = 3

和以该顺序为好。

这可能吗?

+0

所以对于'K = 4'你将有'1_0_0_0 0_1_0_0 0_0_1_0 0_0_0_1'? – dawg

回答

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" 
+0

我不确定角色subtitiution工程...可以做的其他方式? –

+0

@mastersplinter:你运行的是什么版本的bash? – choroba

1

这里是一个循环,将打印相应的名称到标准输出双

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 
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 
2

纯巴什解决方案(外部公用事业无呼叫) :顶一下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 
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