특정 수준의 하위 폴더 이름 바꾸기

특정 수준의 하위 폴더 이름 바꾸기

다음과 같이 상위 폴더 내에 하위 폴더 목록이 있습니다.

Parent folder
    folder1
       foldera
    folder2
       folderb
    folder3
       folderc

하위 폴더 이름에서 마지막 두 문자를 제거하여 두 번째 수준의 하위 폴더 이름을 바꾸고 싶습니다. 어떻게 해야 합니까? 나는 다음과 같은 것을 시도했습니다

find . -depth -type d -exec sh -c 'mv "${0}" "${0%??}"' {} \; 

그러나 성공하지 못했습니다.

답변1

아니요 . 다음 디렉터리 구조를 고려하면 findpure 와 함께 사용할 수 있습니다 .bash

./folder3
./folder3/folderc
./folder2
./folder2/folderb
./folder1
./folder1/foldera

주문하다:

for f in folder*/*/; do mv -v "$f" "${f%???}"; done

뒤쪽에:

./folder3
./folder3/folde
./folder2
./folder2/folde
./folder1
./folder1/folde

이것파일 이름 확장자여기서는 하위 폴더 내의 폴더만 일치 folder*/*/하므로 끝에 슬래시가 있습니다. 이 mv명령은 마지막 두 문자(위의 경우 3자)를 제거합니다. 왜냐하면 후행 슬래시도 변수 값에 계산되기 때문입니다.

답변2

비결은 최소 깊이와 최대 깊이 매개변수를 사용하는 것입니다. 이것은 제가 사용하는 명령입니다.

`find folder -mindepth 2 -maxdepth 2 -type d -exec sh -c 'mv "${0}" "${0%?}"' {} \;`

또한 내가 사용한 double ?? 대신 ${0$?}를 사용했다는 점에 유의하세요. 이와 같은 문제를 찾기 위해 디버그하는 한 가지 방법은 에코를 사용하여 작업을 추가하는 것입니다. 따라서 위의 예에서는 mv 명령 앞에 echo를 배치합니다.

$ find .
.
./folder
./folder/folder1
./folder/folder1/foldera
./folder/folder2
./folder/folder2/folderb
./folder/folder3
./folder/folder3/folderc
$ find folder -mindepth 2 -maxdepth 2 -type d -exec sh -c 'mv "${0}" "${0%?}"' {} \;
$ find .
.
./folder
./folder/folder1
./folder/folder1/folder
./folder/folder2
./folder/folder2/folder
./folder/folder3
./folder/folder3/folder

그런데 폴더의 상위 디렉터리에 있기 때문에 find .or 를 사용할 수 있습니다. find folder그러나 exec 명령을 사용하면 find .상위 디렉터리 내의 모든 하위 디렉터리가 변환됩니다. 이동, 삭제 등을 할 때 일반적으로 예상치 못한 결과를 피하기 위해 디렉터리를 명시적으로 나열하는 것이 가장 좋습니다.

관련 정보