Renomeie vários diretórios usando o comando rename, nome envolve parenthresis

0

Eu tenho uma lista de diretórios marcados com "(Concluído)" no final do marcador.

Por exemplo: "Pasta 1 (Concluído)"

Eu estou olhando para remover "(Feito)" de cada diretório usando o comando renomear. Por ser um caractere especial, estou usando o caractere de escape.

rename s/\(Done\)//g *

No entanto, este comando não funciona. Ele remove a palavra "Concluído" e deixa os parênteses: "Pasta 1 ()"

    
por cworner1 15.06.2018 / 15:12

3 respostas

2

\ é um operador de cotação na sintaxe da shell, então:

rename s/\(Done\)//g *

é o mesmo que executar:

rename 's/(Done)//g' *

E ( , ) são caracteres especiais na sintaxe da expressão regular perl (que rename usa) e precisam ser prefixados com \ (ou alterados para [(] e [)] ) para que são tratados literalmente.

Então, aqui você quer:

rename 's/\s*\(Done\)//g' ./*

Aqui também adicionamos \s* para remover qualquer espaço em branco antes de (Done) e um prefixo ./ , pois algumas variantes de rename se enfunam em nomes de arquivos que começam com - .

    
por 15.06.2018 / 15:44
0

Isso deve funcionar:

rename 's/\(.*\)|\[.*\]//g' *

Caso contrário, sem usar o comando rename (OT):

for file in folder*; do                                                          
    mv "$file" "${file/\(Done\)/}"
done
    
por 15.06.2018 / 15:39
0

Usando find :

find topdir -maxdepth 1 -type d -name '* (Done)' -exec sh -c '
    for pathname do
        mv "$pathname" "${pathname%" (Done)"}"
    done' sh {} +

Isso usa find para escolher os diretórios que têm ␣(Done) no final de seus nomes e, em seguida, usa uma substituição de parâmetro padrão para remover essa sequência.

Nenhuma verificação é feita para garantir que ainda não exista um diretório / arquivo com o nome de destino no mesmo diretório.

O script sh -c acima poderia obviamente ser executado por si só também, com pequenas modificações para fazer os testes que find fizeram para ele:

for pathname in topdir/*' (Done)'/; do
    mv "$pathname" "${pathname%' (Done)/'}"
done
    
por 15.06.2018 / 16:10

Tags