我需要一種方法,我可以在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