모든 폴더의 이름을 "dd.mm.yy"에서 "yy.mm.dd"로 바꾸고 싶습니다. 쉘에서 이를 수행하는 방법은 무엇입니까?
답변1
bash
현재 디렉터리 내의 디렉터리 이름을 바꾸는 솔루션:
for f in [0-3][0-9].[01][0-9].[0-9][0-9]; do
[ -d "$f" ] && mv -v "$f" "${f:6}.${f:3:2}.${f:0:2}"
done
답변2
귀하의 질문에 더 많은 정보가 필요할 수 있으므로 다음과 같이 가정하겠습니다.
- 모든 폴더는 현재 디렉터리의 모든 폴더를 나타냅니다.
rename
정규식을 언급했을 때 운영 체제를 무시했기 때문에 귀하의 버전에서 해당 정규식을 지원한다는 점을 전제로 작업 중입니다.
rename 's/^([0-9]{2})\.([0-9]{2})\.([0-9]{2})\//$3.$2.$1/' */
가 없거나 rename
정규 표현식을 지원하지 않는 경우, 다음은 보다 이식성이 뛰어난(덜 우아하지만) 접근 방식입니다.
find . -mindepth 1 -maxdepth 1 -type d \
| sed 's ^./ ' \
| grep -E "^([0-9]{2}\.){2}[0-9]{2}$" \
| while IFS=. read dd mm yy ; do mv $dd.$mm.$yy $yy.$mm.$dd ; done
답변3
이는 한 줄보다 길지만 날짜에 대해 어떠한 가정도 하지 않습니다.
$ mkdir 12.12.12 01.02.99
$ perl -MTime::Piece -Mautodie -E '
opendir my $dh, ".";
while (my $f = readdir $dh) {
if (-d $f and $f =~ /^\d\d.\d\d.\d\d$/) {
my $t = Time::Piece->strptime($f, "%d.%m.%y");
rename $f, $t->ymd;
}
}
'
$ ls
1999-02-01/ 2012-12-12/
답변4
폴더가 이미 생성되어 있으므로 매우 간단한 방법입니다.
ls -1d */|cut -f1 -d/ |awk -F"." '{print "mv " $0 " " $3"."$2"."$1"/"}' | bash