중첩된 폴더의 이름을 바꾸는 방법은 무엇입니까?

중첩된 폴더의 이름을 바꾸는 방법은 무엇입니까?

그래서 저는 다음으로 포맷된 폴더를 많이 가지고 있으며 .../course/year/..., 포맷이 다음으로 변경되도록 자주 재구성합니다: .../year/course/.... 저는 항상 셸 스크립트 작성 방법을 배우고 싶었고, 자동화와 셸 스크립트도 처음이지만 내가 원하는 폴더의 경로를 입력하면 알아서 해 주는 스크립트를 만들고 싶었습니다. 이름을 바꿉니다. 예를 들어 다음과 같은 명령이 있을 수 있습니다. sh reorganize.sh .../course/year/... 이는 코스 폴더와 연도 폴더를 "교환"합니다. 연도 폴더 안에 일부 콘텐츠가 있습니다. 교체한 후에는 연도 폴더의 모든 내용이 이제 코스 폴더에 있어야 합니다. 여러 연도 폴더도 있으므로 2018, 2019, 2020은 모두 코스 폴더 내에 자체 폴더가 있습니다. 이 작업을 수행하는 방법에 대한 도움을 주셔서 감사합니다.

추신 - 제가 상당히 초보라는 것은 제가 변수, 파이프, 기본 명령의 기본 사항을 알고 있지만 그 이상은 아니라는 뜻입니다.

답변1

#! /bin/bash

rootdir="$PWD"
shopt -s nullglob

for course in *; do
    pushd "$course" >/dev/null
    for year in *; do
        mkdir -p "${rootdir}/${year}"
        mv --no-target-directory "$year" "${rootdir}/${year}/${course}"
    done
    popd >/dev/null
    rmdir "$course"
done

rootdir="$PWD"디렉토리 사이를 이동할 때 절대 경로( ) 및 pushd/ 를 대신 사용하는 popd것이 오류가 덜 발생한다고 생각합니다 cd. 이 간단한 경우에는 이것이 필요하지 않습니다.

mv --no-target-directory이렇게 하면 스크립트가 여러 번 실행되는 경우(이전 실행이 중단됨) 의도하지 않은 결과가 발생하는 것을 방지할 수 있습니다. 마찬가지로 이 경우(파일 시스템 내에서 이동) 위험한 상황은 발생하지 않는다고 주장할 수 있습니다. mv동작은 대상 디렉터리/새 경로가 존재하는지 여부에 따라 다릅니다. 이 옵션을 사용하면 이러한 일이 발생하지 않습니다.

관련 정보