실행 시 다음 구조를 생성하는 스크립트를 생성할 수 있습니까?
/test/1/1 -> A
/test/1/2 -> B
/test/1/3 -> C
/test/1/4 -> D
/test/1/5 -> E
/test/1/6 -> F
/test/1/7 -> G
/test/1/8 -> H
/test/1/9 -> I
/test/1/10 -> J
/test/1/11 -> K
/test/1/12 -> L
/test/1/13 -> M
/test/1/14 -> N
/test/1/15 -> O
/test/2/1 -> P
/test/2/2 -> Q
/test/2/3 -> R
/test/2/4 -> S
/test/2/5 -> T
/test/2/6 -> U
/test/2/7 -> V
/test/2/8 -> X
/test/2/9 -> Y
/test/2/10 -> Z
/test/2/11 -> A
/test/2/12 -> B
/test/2/13 -> C
/test/2/14 -> D
/test/2/15 -> E
/test/3/1 -> F
/test/3/2 -> G
/test/3/3 -> H
.........
/test/10/15 -> ???
보시다시피, 이 예에서 "test" 디렉터리는 상위 디렉터리이고 번호가 매겨진 디렉터리는 하위 디렉터리입니다. 이 문자는 폴더가 아니라 파일입니다. 알파벳이 끝날 때마다 다음 디렉토리의 시작 부분에서 시작됩니다.
수동으로 작성하는 대신 스크립트를 더 쉽게 작성하려면 어떻게 해야 합니까?
답변1
그리고 zsh
:
dirs=(test/{1..10}/{1..15}) n=0
mkdir -p $dirs &&
for d ($dirs) {:>$d/$(([##36]n%26+10)); ((n++))}
A
위의 비결은 10부터 35까지의 숫자가 다음과 같이 표현되는 base36 숫자를 사용하는 것입니다 Z
. 이해하고 요약하는 것이 더 쉬울 것입니다.
dirs=(test/{1..10}/{1..15}) n=0 l=({A..Z})
mkdir -p $dirs && for d ($dirs) : > $d/$l[1 + n++ % $#l]
답변2
echo /test/{1..10}/{1..15} " " |
( chars=({A..Z}); i=0;
while read -d " " dir; do
test -z "$dir" && break;
echo mkdir -p "$dir";
echo touch "${dir}/${chars[i]}";
((i++));
i=$((i%26));
done )