Remove todos os colchetes no nome do arquivo

1

Estou tentando remover todos os colchetes do (s) meu (s) nome (s). Alguém pode me ajudar a criar um script bash para fazer isso?

Este script bash abaixo funciona perfeitamente para o (s) nome (s) do (s) arquivo (s) de colchetes, mas se houver colchetes, ele duplicará o nome do arquivo:

#!/bin/bash

for fname in *; do
    name="${fname%\.*}"
    extension="${fname#$name}"
    newname="${name//[/}"
    newfname="$newname""$extension"
    if [ "$fname" != "$newfname" ]; then
        #echo mv "$fname" "$newfname"
        mv "$fname" "$newfname"
    fi
done

Exemplo de saída:

$ touch [test]
$ ls
[test] rep.sh
$ bash rep.sh
$ ls
rep.sh  test][test]

Por isso, removeu o colchete esquerdo, mas repetiu o nome do arquivo.

    
por juicebyah 10.06.2015 / 02:50

4 respostas

2

eu encontrei este forro e este trabalho:

for x in *[*; do mv -- "$x" "${x//[/}"; done

isso deve fazer o trabalho, basta substituir o suporte esquerdo ou direito toda vez que você executar este comando

    
por 10.06.2015 / 03:01
1

A solução postada por @juicebyah somente removerá o colchete inicial. Se o OP quiser remover os dois suportes, é melhor usar sed desta forma:

find . -type f -iname "*[*" | \
while IFS= read -r line; \
do mv "$line" "$(printf %s "$line" | sed -re 's/(\[|\])//g')"; done;
    
por 10.06.2015 / 09:12
0

É ainda mais simples com rename incorporado em uma linha dupla:

while rename ] '' *; do true; done
while rename [ '' *; do true; done

rename substitui a primeira ocorrência de $ 1 por $ 2 em nome (s) de arquivo em $ 3 + e este bloco remove todos os parênteses em todos os nomes de arquivos e diretórios em CWD .

    
por 10.06.2015 / 17:14
0

O motivo pelo qual o nome do arquivo é duplicado é que, se $fname for [test] ,

name="${fname%\.*}"
extension="${fname#$name}"

resulta em:

name=[test]
extension=[test]

(Explicação abaixo.) Mais tarde, quando $extension for concatenado para $newname , você obterá test][test] .

O que você deveria ter usado:

name=${fname%.*}
extension=${fname#"$name"}

As aspas ao redor da expansão do parâmetro são desnecessárias (neste caso) porque a divisão de palavras não ocorre após a expansão do parâmetro nas atribuições de variáveis. Além disso, não há nada de especial sobre . , portanto, não houve necessidade de escape de barra invertida.

Mas as cotações em torno de $name na segunda linha são essenciais; se a expansão de $name não for citada, ela será tratada como um padrão glob e seu valor [test] será interpretado como "um único e , s ou t ". Isso não corresponde ao prefixo $fname , portanto, sem essas citações, extension é definido apenas para o valor de $fname .

Independente do acima, você pode remover todos os colchetes de um nome com:

${fname//[][]/}

O padrão é uma classe de caracteres; dentro de uma classe de caracteres, ] é considerado um caractere comum se for o primeiro caractere da classe, e [ é sempre considerado um caractere comum. Portanto, a classe de caractere consiste em ] e [ nessa ordem.

    
por 11.06.2015 / 04:22