Usando Perl renomear para renomear arquivos e diretórios

Usando Perl renomear para renomear arquivos e diretórios

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::Ruleirá ajudá-lo a encontrar diretórios.
  • Perl renamefará o resto do trabalho.

informação relacionada