Batch renomeia o arquivo por substring o nome do arquivo

2

Eu tenho arquivos

..
00016_0912RP10R6_RampMotorway9_0912RP10R6_13.646852_100.687103.jpg
00017_0912RP10R6_RampMotorway9_0912RP10R6_13.646956_100.686897.jpg
00018_0912RP10R6_RampMotorway9_0912RP10R6_13.647067_100.686684.jpg
...

Eu gostaria de ter

00016.jpg
00017.jpg
00018.jpg

Qual é o melhor comando linux para percorrer subpastas e renomeá-lo?

    
por Korr Iamnot 20.07.2018 / 14:03

3 respostas

0

Usando find :

find . -type f -name '*_*.jpg' -exec sh -c '
    for pathname do
        newname=${pathname##*/}
        newname="${pathname%/*}/${newname%%_*}.jpg"
        printf "Would move %s to %s\n" "$pathname" "$newname"
        # mv -i "$pathname" "$newname"
    done' sh {} +

Isto encontraria os nomes de caminho todos os arquivos regulares dentro ou abaixo do diretório atual cujos nomes correspondem ao padrão dado. Para lotes desses nomes de caminho, é executado um pequeno script de shell que faz um loop sobre os nomes de caminho fornecidos e renomeia os arquivos (a real renomeação é comentada por segurança).

Dado um nome de caminho como ./a/b/c/foo0_some_other_bits.jpg , o script de shell transformaria isso em ./a/b/c/foo0.jpg primeiro excluindo os diretórios (produzindo foo0_some_other_bits.jpg ) e, em seguida, excluindo tudo após o primeiro caractere _ e adicionando os diretórios novamente. O bit de diretório do nome do caminho é excluído e substituído apenas no caso de conter um ou vários caracteres _ . Isso é feito usando expansões de parâmetros padrão.

Usando a opção globstar shell em bash :

shopt -s globstar   # use "set -o globstar" in ksh93, or remove completely in zsh
for pathname in ./**/*.jpg; do
    [ -f "$pathname" ] || continue
    newname=${pathname##*/}
    newname="${pathname%/*}/${newname%%_*}.jpg"
    printf "Would move %s to %s\n" "$pathname" "$newname"
    # mv -i "$pathname" "$newname"
done

Isso é exatamente equivalente ao comando find acima, com a única diferença de que ele não encontraria nomes ocultos (adicione shopt -s dotglob para isso).

    
por 20.07.2018 / 14:25
0

Maneira simples de usar a substituição de parâmetros em bash :

for file in *.jpg; do mv "${file}" "${file/_*/.jpg}";done

Isso passará pelos arquivos se for executado no diretório em que estão.

    
por 20.07.2018 / 14:23
0
pax -rw -'s/_[^/]*\.jpg/.jpg/' -'s/.*//' . .

pode funcionar.

    
por 28.07.2018 / 11:19