두 디렉터리 간에 파일을 이동하는 쉘 스크립트

두 디렉터리 간에 파일을 이동하는 쉘 스크립트

JAN/Jan/FEB/Feb/MAR/Mar/ 등과 같은 하위 폴더가 있는 여러 폴더가 있습니다. 모든 파일을 JAN/*에서 Jan/으로, FEB/*에서 Feb/로 이동해야 합니다. 쉘 스크립트를 사용하여 이를 어떻게 달성할 수 있습니까?

편집하다
올바른 방향을 알려준 @Costas에게 감사드립니다. 그의 솔루션은 Bash 4 이상에서 작동합니다. 나는 v3를 가지고 있기 때문에 이것을 사용하게 되었습니다.

for DIR in [A-Z][A-Z]*/
do
    NEWDIR=`echo "$(echo "$DIR" | sed 's/.*/\L&/; s/[a-z]*/\u&/g')"`
    mv $DIR/* $NEWDIR
done

sed 스크립트에서 가져옴여기.

답변1

최신의 경우 bash(대소문자 변경 지원):

for dir in [A-Z][a-z]*/
do
    mv -t "$dir" ${dir^^}/*
done

지원되지 않는 버전에서는 tr| sed...를 대신 사용하여 자유롭게 변환할 수 있습니다.

답변2

Perl 기반 rename유틸리티(Debian에서는 표준으로 사용 가능하지만 prename일부 다른 시스템에서는 이 유틸리티라고도 함)를 사용하면 단일 명령으로 이 작업을 수행할 수 있습니다.

( LC_ALL=C; prename -v 's!^([A-Z])([A-Z]{2}/)!$1\L$2!' [A-Z][A-Z][A-Z]/* )

이렇게 하면 C로케일에서 파일 이름 일치가 대소문자를 구분하도록 하여 파일 패턴이 [A-Z][A-Z][A-Z]모두 대문자로 된 월만 선택할 수 있도록 합니다. 이 대체는 세 개의 대문자를 하나의 대문자와 두 개의 소문자로 바꿉니다.

원하는 경우 파일 이름 패턴을 [A-Z][A-Z][A-Z]/*12개월 전체의 명시적 목록으로 바꿀 수 있습니다.{JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC}/*

관련 정보