_QWE라는 디렉터리의 하위 하위 디렉터리 이름을 바꿉니다.

_QWE라는 디렉터리의 하위 하위 디렉터리 이름을 바꿉니다.

다음 이름의 모든 디렉터리에서 명령을 실행할 수 있습니다 _QWE.

find . -name '_QWE' -type d -execdir touch {}/1234.txt \;

그러나 -execdir rename 's!^\./(\d+ -)\s(\d+\.)!$1!' {} \;._QWE_QWE

내 말은 다음과 같은 디렉토리 구조가 있다고 가정 해 보겠습니다.

├── folder_1
│   └── _QWE
│       ├── Course 1
│       │   ├── 1 - Introduction
│       │   ├── 2 - 1. Basics of Course 1
│       │   ├── 3 - 2. Conclusion of Course 1
│       ├── Course 2
│       │   ├── 1 - Introduction
│       │   ├── 2 - 1. Basics of Course 2
│       │   ├── 3 - 2. Conclusion of Course 2
├── folder_2
│   └── folder_3
│      └── _QWE
│          ├── Course X1
│          │   ├── 1 - Introduction
│          │   ├── 2 - 1. Basics of Course X1
│          │   ├── 3 - 2. Conclusion of Course X1
│          ├── Course X2
│          │   ├── 1 - Introduction
│          │   ├── 2 - 1. Basics of Course X2
│          │   ├── 3 - 2. Conclusion of Course X2

여기에서 이름을 바꾸고 싶습니다.

1 - Introduction
2 - 1. Basics of Course 1
3 - 2. Conclusion of Course 1
1 - Introduction
2 - 1. Basics of Course 2
3 - 2. Conclusion of Course 2
1 - Introduction
2 - 1. Basics of Course X1
3 - 2. Conclusion of Course X1
1 - Introduction
2 - 1. Basics of Course X2
3 - 2. Conclusion of Course X2

예를 들어 여기서는 3 - 2. Conclusion of Course X2이름이 로 변경됩니다 3 - Conclusion of Course X2. 이것이 수행되는 작업입니다 's!^\./(\d+ -)\s(\d+\.)!$1!'.

명확히 말하면 3 - 2. Conclusion of Course X2파일 이름이 아니라 디렉터리 이름입니다.

어떻게 해야 하나요?

업데이트 1:

다음을 사용하여 경로를 얻을 수 있습니다.

for dir in $(find . -name '_QWE' -type d)/*/ ; do echo $dir ; done

또는,

for dir in $(find . -name '_QWE' -type d)/*/ ; do (cd "$dir"; pwd); done

하지만,

for dir in $(find . -name '_QWE' -type d)/*/*/ ; do rename 's!^\./(\d+ -)\s(\d+\.)!$1!' $dir ; done

출력이 생성되지 않습니다.

답변1

-path수정자를 사용하여 일치하는 디렉터리 바로 아래에 있는 디렉터리를 선택할 수 있습니다 .

find . -depth -type d -path '*/_QWE/*/*' ! -path '*/_QWE/*/*/*' -exec rename 's!(/\d+)\s+-\s+\d+\.\s+([^/]*)$!$1 $2!' {} +

RE를 약간 수정하여 경로와 일치하는 파일 이름 부분에 고정했습니다. (여기에 사용된 PCRE 표현식의 경우 \s+하나 이상의 공백 문자와 일치, \d+하나 이상의 숫자와 일치, [^/]*0개 이상의 문자로 구성된 문자열과 일치와는 별개로 /.)

예제 디렉터리 트리를 사용하면 다음을 사용할 때 해당 출력이 표시됩니다 rename -n.

./folder_1/_QWE/Course 1/2 - 1. Basics of Course 1 renamed as ./folder_1/_QWE/Course 1/2 Basics of Course 1
./folder_1/_QWE/Course 1/3 - 2. Conclusion of Course 1 renamed as ./folder_1/_QWE/Course 1/3 Conclusion of Course 1
./folder_1/_QWE/Course 2/2 - 1. Basics of Course 1 renamed as ./folder_1/_QWE/Course 2/2 Basics of Course 1
./folder_1/_QWE/Course 2/3 - 2. Conclusion of Course 1 renamed as ./folder_1/_QWE/Course 2/3 Conclusion of Course 1
./folder_2/folder_3/_QWE/Course X1/2 - 1. Basics of Course 1 renamed as ./folder_2/folder_3/_QWE/Course X1/2 Basics of Course 1
./folder_2/folder_3/_QWE/Course X1/3 - 2. Conclusion of Course 1 renamed as ./folder_2/folder_3/_QWE/Course X1/3 Conclusion of Course 1
./folder_2/folder_3/_QWE/Course X2/2 - 1. Basics of Course 1 renamed as ./folder_2/folder_3/_QWE/Course X2/2 Basics of Course 1
./folder_2/folder_3/_QWE/Course X2/3 - 2. Conclusion of Course 1 renamed as ./folder_2/folder_3/_QWE/Course X2/3 Conclusion of Course 1

folder_4테스트를 위해 a 아래에 동일한 이름을 가진 샘플 디렉터리 세트를 추가했지만 a 디렉터리 아래에는 추가하지 않았습니다 _QWE. 예상대로 이들은 올바르게 무시됩니다.

관련 정보