Remove espaços em branco e parênteses em nomes de arquivos com sed [duplicado]

1

Eu tenho uma série de arquivos que eu preciso renomear que todos têm o padrão "(*)" neles. Por exemplo:

001 (1).txt
002 (1).txt
003 (2).txt

Minha saída desejada é renomear os arquivos para 001.txt, 002.txt, 003.txt. Observe que os arquivos reais variam em comprimento e tipo de extensão (este é o meu lote de teste).

Eu tenho procurado na net e SE e chego com o seguinte, que me dá a saída desejada no terminal.

ls *\(*\)* | sed 's/\(.*\)\( (.*)\)\(.*\)/mv & /'

mv 001 (1).txt 001.txt
mv 002 (1).txt 002.txt
mv 003 (2).txt 003.txt

No entanto, uma vez que eu canalizo para sh, eu recebo o erro abaixo.

sh: line 1: syntax error near unexpected token '('
sh: line 1: 'mv 001 (1).txt 001.txt'

Eu sei que tem a ver com a seção \( (.*)\) . Eu tentei escapar os parênteses internos, mas então isso não me deu a saída desejada. Eu também procurei por formas regex para dizer a busca pelo espaço em branco seguido por quaisquer 3 caracteres, mas não tive sorte.

Eu sei que existem maneiras mais fáceis de alcançar o que eu quero, mas eu fui com sed, até agora, era a única coisa que eu poderia entender vagamente. Aprecio muito qualquer contribuição para que a linha acima funcione e, em seguida, considere abordagens mais fáceis.

    
por HAKS 21.01.2014 / 04:56

3 respostas

1

Existe um comando rename que faz exatamente isso, mas eu nunca o usei.

Seu script está próximo. Tente isto:

ls -d -- *\(*\)* | sed 's/\(.*\) (.*)\(.*\)/mv -- "&" ""/'

Observe que '(' é um caractere especial para o shell. Colocá-lo entre aspas duplas cancela seu significado especial.

    
por 21.01.2014 / 05:17
5

Usando o Bash

Você pode usar este comando para fazer isso usando estritamente apenas Bash:

$ for file in ./*; do mv "$file" "${file/ (*)/}"; done

Exemplo

$ ls -1
001 (1).txt
002 (1).txt
003 (2).txt

Executando o comando acima:

$ for file in ./*; do mv "$file" "${file/ (*)/}"; done
$ ls -1
001.txt
002.txt
003.txt

Usando renomear

Algumas distros (Debian / Ubuntu) incluem o comando rename . Você pode fazer o que quiser usando esta versão do rename .

$ rename -v 's/ \(.*\)\./\./' ./*.txt

Exemplo

$ rename -v 's/ \(.*\)\./\./' ./*.txt
001 (1).txt renamed as 001.txt
002 (1).txt renamed as 002.txt
003 (2).txt renamed as 003.txt

$ ls -1
001.txt
002.txt
003.txt

No entanto, as distribuições da Red Hat não incluem esta versão de rename .

Referências

por 21.01.2014 / 05:35
1
for i in *'('*')'*
do
    mv "$i" 'echo $i | sed 's/\(.*\) (.*).\(.*\)/./''
done
    
por 21.01.2014 / 05:34

Tags