Posso executar um comando em todos os diretórios nomeados _QWE
usando:
find . -name '_QWE' -type d -execdir touch {}/1234.txt \;
No entanto, preciso executar -execdir rename 's!^\./(\d+ -)\s(\d+\.)!$1!' {} \;
em todos os subdiretórios imediatos de _QWE
para renomear os subdiretórios dos subdiretórios de _QWE
.
Quero dizer, suponha que eu tenha uma estrutura de diretório como:
├── 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
Aqui eu quero renomear:
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
Aqui, por exemplo, 3 - 2. Conclusion of Course X2
será renomeado para 3 - Conclusion of Course X2
. Isto é o que 's!^\./(\d+ -)\s(\d+\.)!$1!'
faz.
Só para ficar claro, 3 - 2. Conclusion of Course X2
é um nome de diretório e não um nome de arquivo.
Como eu posso fazer isso?
Atualização 1:
Eu poderia obter os caminhos usando:
for dir in $(find . -name '_QWE' -type d)/*/ ; do echo $dir ; done
ou,
for dir in $(find . -name '_QWE' -type d)/*/ ; do (cd "$dir"; pwd); done
Mas,
for dir in $(find . -name '_QWE' -type d)/*/*/ ; do rename 's!^\./(\d+ -)\s(\d+\.)!$1!' $dir ; done
Não rendendo nenhuma saída.
Você pode usar o
-path
modificador para escolher os diretórios imediatamente abaixo dos diretórios correspondentes:Modifiquei ligeiramente o seu RE para ancorá-lo ao componente de nome de arquivo do caminho correspondente. (Para expressões PCRE como usadas aqui,
\s+
corresponde a um ou mais caracteres de espaço em branco;\d+
corresponde a um ou mais dígitos;[^/]*
corresponde a uma sequência de zero ou mais caracteres, exceto/
.)Usando sua árvore de diretórios de exemplo, aqui está a saída correspondente ao usar
rename -n
:Para teste, também adicionei um conjunto de amostra de diretórios usando os mesmos nomes em a,
folder_4
mas não em um diretório_QWE
. Como esperado, eles foram corretamente ignorados.