
Quero poder fazer isso: renomear string1
e string3
adicionar string2
ao início. Algo como Fish renomeado para Great_Bear se a string Fish for encontrada e Great_ = string2.
Até agora eu tenho isso:
ls | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash
Isso faz o trabalho para o diretório atual.
ls -d $PWD/**/* | sed s'/\(.*\)\(string1\)\(.*\)/mv \"&\" \"\1string3\" /' | bash
Isso funciona apenas em subdiretórios e não naquele onde está o script.
Também gostaria de saber como adicionar string2
no início do nome do arquivo.
Responder1
Eu usaria rename
com uma combinação simples */*
, 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 que o globstar porque não queremos recorrer muito.
O -n
final para na verdadefazendoqualquer coisa. Isso apenas mostrará a você. Remova isso quando tiver certeza de que está correto. Aqui está um pequeno equipamento de teste:
$ 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
Responder2
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/' {} +
: combina e agrupa qualquer número de qualquer caractere até a última ocorrência de/
, corresponde a/
, combina e agrupa qualquer número de qualquer caractere até a última ocorrência destring1
, combinastring1
e combina e agrupa qualquer número de qualquer caractere; substitui a correspondência pelo primeiro grupo capturado seguido por um/
caractere seguido porstring3
seguido pelo segundo grupo capturado seguido porstring2
seguido pelo terceiro grupo capturado (-n
fazrename
uma simulação; 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)