파일에 영향을 주지 않고 디렉터리와 하위 디렉터리의 이름을 바꿉니다.

파일에 영향을 주지 않고 디렉터리와 하위 디렉터리의 이름을 바꿉니다.

접두사 "ms_PF"를 사용하여 루트 디렉터리 아래 디렉터리의 이름을 바꾼 다음 기본 디렉터리의 수정된 이름을 사용하여 하위 디렉터리의 이름을 바꾸고 추가 "_"를 추가한 다음 모든 디렉터리와 하위 디렉터리를 루트 디렉터리에 복사해야 했습니다. 다음과 같습니다:

root
   maindir1
   maindir2
           subdir1
           subdir2
           subdir3

maindir1 및 maindir2는 접두사 "ms_PF_"로 이름이 바뀌고 루트에 직접 복사됩니다. maindir2에는 하위 디렉터리가 있으므로 maindir2의 새 이름, 즉 ms_PF_maindir2에 밑줄(_)을 더한 다음 모든 하위 디렉터리가 다음과 같이 루트에 복사됩니다.

ms_PF_maindir1
ms_PF_maindir2_subdir1
ms_PF_maindir2_subdir2
ms_PF_maindir2_subdir3

이 문제에 대해 도움을 주셔서 감사합니다. 내가 시도한 해결책은 이것이었지만 실제로는 수정이 필요합니다.

root_dir="/dwn/icbu_dwn/LL"
prefix="ms_PF_"
do_it () {
awk '{ print "mv $root_dir $prefix ${root_dir/\//_}" }' | sh
}
find "$root_dir" -depth -type d | do_it

답변1

디렉토리가 몇 개밖에 없다면 수동으로 수행하십시오(다른 작업을 수행하는 것보다 작성/디버깅 작업이 더 많이 소요됩니다).

컬렉션이 큰 경우 find(1)즐겨 사용하는 편집기를 사용하여 영향을 받는 파일 목록을 만들고 이를 이동을 수행하는 스크립트로 변환하세요. 오류를 확인한 후 실행하세요.

sed(1)더 크거나 중복되는 경우 기본적으로 위와 동일한 작업을 수행하지만 즉시 "새 이름에 대한 경로 편집"을 사용합니다. 아마도 전화를 통해 직접 받을 수도 있습니다 find. 초보자들에게 겁을 줄 수 있는 훌륭한 농담이 될 것입니다...

답변2

그러면 올바른 순서로 이름이 변경됩니다. 첫 번째 패턴의 후행 슬래시는 일치 항목을 디렉터리로 제한합니다.

cd root
for dir in maindir*/*/ maindir*; do
    echo mv $dir ms_PF_${dir/\//_}
done

산출

mv maindir2/subdir1/ ms_PF_maindir2_subdir1/
mv maindir2/subdir2/ ms_PF_maindir2_subdir2/
mv maindir2/subdir3/ ms_PF_maindir2_subdir3/
mv maindir1 ms_PF_maindir1
mv maindir2 ms_PF_maindir2

관련 정보