adicionando caracteres especiais aos nomes das pastas

3

Eu tenho uma longa lista de pastas com a seguinte convenção de nomenclatura

ABS1789_2563-01
ABS1789_2563-02
ABS1789_2563-02

.
.
.

Como posso adicionar "-" entre ABS e 1789 e substituir "_" por "-" entre 1789 e 2563 usando bash?

    
por Thomas Dickey 28.04.2016 / 01:03

3 respostas

4
IFS="\n"                        # Handle files with spaces in the names
for file in ABS*; do
    newfile="${file/ABS/ABS-}"  # Add the hyphen following ABS
    newfile="${newfile/_/-}"    # Change the underscore to a hyphen
    mv "$file" "$newfile"       # Make the change
done

À luz dos comentários de Tony abaixo, uma versão de uso mais geral poderia ser a seguinte:

IFS="\n"                          # Handle files with spaces in the names
for file in ABS*; do
    newfile="${file/foo/bar}"     # Replace foo with bar
    newfile="${newfile/baz/quux}" # Replace baz with quux (repeat as needed)
    if [[ "$file" == "$newfile" ]]; then
        echo "Not renaming $file - no change decreed."
    elif [[ -f "$newfile" ]]; then
        echo "Not renaming $file - $newfile already exists."
    else
        mv -- "$file" "$newfile"       # Make the change
    fi
done
    
por 28.04.2016 / 01:33
2

Uma resposta adequada depende de como os nomes podem variar. Você poderia transformar os nomes usando a substituição de parâmetros internos do shell se você assumir constantes larguras de campo. Isso é relativamente limitado em escopo.

Mais interessante seria o uso de classes de caracteres em sed :

newname=$(echo "$oldname" | sed -e 's/^\([[:alpha:]]\+\)\([[:digit:]]\+\)_/--/')

ou seja, depois de um prefixo alfabético principal, adicione um traço e, depois dos dígitos que terminam com um sublinhado, altere esse para um traço.

Diferentemente das possíveis soluções usando a substituição de parâmetro, essa abordagem permite qualquer comprimento (diferente de zero) do prefixo e dígitos alfabéticos. Então você pode ter isso como entrada:

ABS1789_2563-01
ABS1789_2563-02
ABS1789_2563-02
ABSOLUTE1789_2563-01
ABSURD1789_2563-02
ABSOLVE1789_2563-02
PREFIX1793939389_2563-02

coloque isso em um script

#!/bin/sh
for oldname in 'cat foo4.txt'
do
newname=$(echo "$oldname" | sed -e 's/^\([[:alpha:]]\+\)\([[:digit:]]\+\)_/--/')
echo "$oldname ->$newname"
done

dando esta saída (em um loop adequado):

ABS1789_2563-01 ->ABS-1789-2563-01
ABS1789_2563-02 ->ABS-1789-2563-02
ABS1789_2563-02 ->ABS-1789-2563-02
ABSOLUTE1789_2563-01 ->ABSOLUTE-1789-2563-01
ABSURD1789_2563-02 ->ABSURD-1789-2563-02
ABSOLVE1789_2563-02 ->ABSOLVE-1789-2563-02
PREFIX1793939389_2563-02 ->PREFIX-1793939389-2563-02
    
por 28.04.2016 / 01:35
1

Se tudo começar com ABS1789_2563-

for f in ABS*; do mv "$f" ABS-1789-2563-${f:13}; done

aqui

ABS-1789-2563-

é simplesmente codificado com base no pressuposto de que todas as suas pastas começam com ABS1789_2563 - .

${f:13}

expande para o final do parâmetro $f a partir do deslocamento 13 - geralmente chamado de substring . Em bash Expansão de Substring .

Veja 3.5.3 Expansão do Parâmetro da Shell , seção:

${parameter:offset}
${parameter:offset:length}
    
por 28.04.2016 / 01:33

Tags