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
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.
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
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;
É 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 .
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.
Tags bash rename shell-script filenames