Usando renomear para renomear arquivos e diretórios

3

Estou usando a ferramenta de linha de comando para renomear o Linux para pesquisar recursivamente por meio de um diretório para renomear os diretórios e os arquivos encontrados. O problema que estou correndo é o renomear comando irá renomear um subdiretório de um arquivo, em seguida, tentar renomear o diretório pai do mesmo arquivo. Isso falhará porque o subdiretório foi renomeado, resultando em "Nenhum arquivo ou diretório"

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 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 renomear que consertarão isso ou eu preciso fazer isso de uma maneira diferente?

    
por Bobbake4 23.05.2017 / 15:53

1 resposta

7

Eu faria isso de uma maneira diferente - especificamente, usando uma pesquisa em profundidade no lugar do shell globstar **

Por exemplo, usando o 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
    
por 23.05.2017 / 16:31