Estou usando a ferramenta de linha de comando Perl rename para pesquisar recursivamente em um diretório para renomear quaisquer diretórios, bem como os arquivos que encontrar. O problema que estou enfrentando é que o comando rename renomeará um subdiretório de um arquivo e tentará renomear o diretório pai do mesmo arquivo. Isso falhará porque o subdiretório foi renomeado, resultando em "Esse arquivo ou diretório não existe"
Comando:
rename -f 's/foo/bar/' **
rename -f 's/Foo/Bar/' **
Por exemplo, aqui está um arquivo original que eu gostaria de substituir ‘foo’ por ‘bar’
Arquivo:
/test/foo/com/test/foo/FooMain.java
Falha:
Can't rename /test/foo/com/test/foo/FooMain.java /test/bar/com/test/foo/FooMain.java: No such file or directory
Arquivo preferido:
/test/bar/com/test/bar/BarMain.java
Você pode ver na mensagem de erro que ele está tentando renomear o diretório pai, mas nesse ponto o subdiretório já foi alterado, resultando no erro de arquivo não encontrado. Existem parâmetros para o comando rename que corrigirão isso ou preciso fazer isso de uma maneira diferente?
Responder1
Eu faria isso de uma maneira diferente - especificamente, usando uma pesquisa em profundidade no lugar do shell globstar**
Por exemplo, usando GNU find
, dado:
$ tree
.
└── dir
├── foo
│ └── baz
│ └── MainFoo.c
└── Foo
├── baz
└── MainFoo.c
5 directories, 2 files
então
find . -depth -iname '*foo*' -execdir rename -- 's/Foo/Bar/;s/foo/bar/' {} +
resulta em
$ tree
.
└── dir
├── bar
│ └── baz
│ └── MainBar.c
└── Bar
├── baz
└── MainBar.c
5 directories, 2 files
Responder2
Conforme observado anteriormente, você está perguntando sobre perl e mostrando o código em sh.
Se você quiser use Perl 5
- O módulo
File::Find::Rule
irá ajudá-lo a encontrar diretórios. - Perl
rename
fará o resto do trabalho.