Substitua parte do nome do arquivo por string nos subdiretórios e no diretório atual

Substitua parte do nome do arquivo por string nos subdiretórios e no diretório atual

Quero poder fazer isso: renomear string1e string3adicionar string2ao 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 string2no início do nome do arquivo.

Responder1

Eu usaria renamecom 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 -nfinal 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 de string1, combina string1e combina e agrupa qualquer número de qualquer caractere; substitui a correspondência pelo primeiro grupo capturado seguido por um /caractere seguido por string3seguido pelo segundo grupo capturado seguido por string2seguido pelo terceiro grupo capturado ( -nfaz renameuma 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)

informação relacionada