x개의 폴더가 있습니다
folder1
folder2
folder3
......
folder100
내가 하고 싶은 것은;
add folder2
reorder
그래서 지금:
folder1
folder2
folder3
......
folder101
이제 폴더 2의 폴더는 폴더 3이 됩니다.
예: 폴더 2 -> 폴더 3, 폴더 3 -> 폴더 4, 폴더 4 -> 폴더 5
폴더 1은 변경되지 않은 상태로 유지됩니다.
더 정확하게는 이것을 자동화하고 싶습니다.
$ mkdir 1 2 3 4 5
$ ls
1 2 3 4 5
$ mkdir 2_1
$ ls
1 2 2_1 3 4 5
$ mv 5 6
$ ls
1 2 2_1 3 4 6
$ mv 4 5
$ mv 3 4
$ mv 2 3
$ mv 2_1 2
$ ls
1 2 3 4 5 6
$
Bash에서 이 작업을 어떻게 수행합니까?
답변1
for..
중괄호 표현식이 있는 절을 사용하여 다음과 같은 인라인 산술뿐만 아니라 열거도 수행 할 수 있습니다 .
for f in {100..2} ; do mv $f $((f+1)) ; done
이렇게 하면 모든 폴더를 100에서 2로 한 단계로 "위로 이동"할 수 있습니다.
보다 일반적으로는 폴더 이름 패턴 X_1에서 삽입 지점 X를 찾고 "구멍 펀치" 앞에 가장 높은 번호의 폴더 이름을 찾는 스크립트를 사용할 수 있습니다. 이 같은:
#!/bin/bash
X=*_1
F=( $(ls * | sort -nr) )
for f in {$F..${X%_1}} ; do mv $f $((f+1)) ; done
mv $X ${X%_1}
이는 $F
모든 폴더 이름의 배열이며, 가장 큰 것부터 가장 작은 것까지 숫자로 정렬되어 있으므로 $F
그 자체가 가장 큰 숫자입니다. 또한 형식은 ${X%_1}
" $X
끝을 제거 _1
"를 의미합니다. 형식은 $((f+1))
"값에 1을 더함 f
"을 의미합니다.
스크립트는 가장 높은 숫자 이상의 "삽입"을 처리하지 않습니다.
답변2
그리고 zsh
:
autoload zmv # best in ~/.zshrc
zmv 'folder(<2->)(#q/nOn)' 'folder$(($1 + 1))' &&
mkdir folder2
또는 folder<n>_1
폴더 존재에 따라 자동으로 이름을 바꿉니다.
setopt extendedglob
for dir ([-._[:alpha:]]##<->_1(N/nOn)) {
[[ $dir = (#b)(*)(<->)_1 ]]
zmv "($match[1])(<$match[2]->)(#q/nOn)" '$1$(($2 + 1))' &&
mv "$dir" "${dir%_1}" || break
}
예:
앞으로:
$ ls
bar1/ bar2/ bar2_1/ bar3/ foo1/ foo1_1/ foo1_3/ foo2/ foo3/ foo4/
뒤쪽에:
$ ls
bar1/ bar2/ bar3/ bar4/ foo1/ foo2/ foo3/ foo4/ foo5/ foo6/
답변3
mkdir에 정규식을 사용하십시오.
mkdir folder{1..100}
그런 다음 출력을 확인하십시오!
ls -l
folder1
folder2
folder3
..
folder100
답변4
제가 해결한 방법은 이렇습니다
#!/bin/bash
for f in {100..2} ; do mv $f $((f+1)); done
x="?_1"
y=$(echo $x | cut -b 1-1)
mv $x $y
이는 매우 수동적이지만 초기 문제를 훨씬 빠르게 해결할 수 있습니다.