Substituir parte do nome do arquivo por string em subdiretórios e diretório atual

0

Eu quero poder fazer isso: renomear string1 para string3 e adicionar string2 ao início. Sth like Fish renomeado para Great_Bear se a string Fish for encontrada e Great_ = string2.

Até agora eu tenho isso:

    ls | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"string3\" /' | bash

Isso faz o trabalho do diretório atual.

    ls -d $PWD/**/* | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"string3\" /' | bash

Isso funciona apenas em subdiretórios e não no subdiretório do script.

Além disso, gostaria de saber como adicionar string2 ao início do nome do arquivo.

    
por Daniel 25.11.2015 / 08:54

2 respostas

0

Isso deve funcionar:

find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
  • find . -type f -exec : procura recursivamente por arquivos na hierarquia do diretório de trabalho atual e executa o restante da linha de comando expandindo {} + para a lista de resultados;
  • rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} + : corresponde e agrupa qualquer número de qualquer caractere até a última ocorrência de / , corresponde a / , corresponde e agrupa qualquer número de qualquer caractere até a última ocorrência de string1 , corresponde a string1 e corresponde e agrupa qualquer número de qualquer caractere; substitui a correspondência pelo primeiro grupo capturado seguido por um caractere / seguido por string3 seguido pelo segundo grupo capturado seguido por string2 seguido pelo terceiro grupo capturado ( -n torna rename executar uma execução a seco ; remova-o para realmente renomear os arquivos).
% tree
.
└── dir
    ├── string1_bar.jpg
    ├── string1_foobar.jpg
    └── string1_foo.jpg

1 directory, 3 files
% find . -type f -exec rename -n 's/(.*)\/(.*)string1(.*)/$1\/string3$2string2$3/' {} +
rename(./dir/string1_foo.jpg, ./dir/string3string2_foo.jpg)
rename(./dir/string1_foobar.jpg, ./dir/string3string2_foobar.jpg)
rename(./dir/string1_bar.jpg, ./dir/string3string2_bar.jpg)
    
por kos 25.11.2015 / 09:57
1

Eu usaria rename com uma correspondência simples de */* , não com o padrão globstar.

rename 's|([^/]+)/(.+)|$1/$1_$2|' */* -vn

Estamos combinando um diretório e algo que ele contém. Isso é um pouco mais seguro do que o globstar porque não queremos recorrer muito.

O -n no final impede que ele faça qualquer coisa. Isso só vai te mostrar. Remova isso quando tiver certeza de que está correto. Aqui está um pequeno arsenal de testes:

$ mkdir -p test/test{1..3} && touch test/test{1..3}/file{1..3}
$ cd test
$ rename 's|([^/]+)/(.+)|$1/$1_$2|' */* -vn
test1/file1 renamed as test1/test1_file1
test1/file2 renamed as test1/test1_file2
test1/file3 renamed as test1/test1_file3
test2/file1 renamed as test2/test2_file1
test2/file2 renamed as test2/test2_file2
test2/file3 renamed as test2/test2_file3
test3/file1 renamed as test3/test3_file1
test3/file2 renamed as test3/test3_file2
test3/file3 renamed as test3/test3_file3
    
por Oli 25.11.2015 / 09:21