2017-06-24 312 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