다음 이름의 모든 디렉터리에서 명령을 실행할 수 있습니다 _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
. 예상대로 이들은 올바르게 무시됩니다.