Como eu chamo um script com um padrão curinga e mais dois argumentos?

0

Eu tenho este código para renomear um monte de arquivos:

#!/bin/bash
for file in $1
    do
        mv -i "${file}" "${file/pattern/replacement}"
    done

Como substituo "pattern" e "replacement" por $ 2 e $ 3?

Este código não funciona:

#!/bin/bash
for file in $1
    do
        mv -i "${file}" "${file/$2/$3}"
    done

Estou tentando renomear usando os 3 argumentos a seguir: file_*.jpg jpg bak (o resultado deve renomear todos os arquivos *.jpg para *.bak files). Mas tudo o que faz é: mv -i file_01.jpg file_01.jpg (portanto, não renomear nada, já que ambos os argumentos mv são idênticos, mais ele pára no primeiro arquivo, mesmo quando há mais arquivos *.jpg ). Se eu digitar manualmente jpg e bak no script bash em vez de $2 e $3 , então FUNCIONAR.

    
por OMA 16.11.2016 / 12:05

2 respostas

4

Você chama seu script com

./script file_*.jpg jpg bak

Mas * é expandido antes de ser passado para o script. Supondo que você tenha os arquivos file_1.jpg , file_2.jpg e file_3.jpg em sua pasta, isso é o que é chamado:

./script file_1.jpg file_2.jpg file_3.jpg jpg bak

, o que significa que ${1} = file_1.jpg , ${2} = file_2.jpg e ${3} = file_3.jpg .

Pode ser melhor escrever o seu script de forma tal que (no seu exemplo): ${1} = jpg e ${2} = bak . Então você pode armazenar essas variáveis em seu script, invocar shift 2 para se livrar delas e fazer um loop sobre todos os argumentos posicionais simplesmente usando

for file; do
    # do something
done
    
por 16.11.2016 / 14:26
0

Este é o código que eu criei com base nas dicas do @pfnuesel e @ Stéphane Chazelas:

#!/bin/bash

preview="false"
found="false"

if [ $# -eq 0 ]; then
    echo "Syntax: ren [-p] expression replacement files..."
else
    if [ "$1" == "-p" ] || [ "$1" == "-P" ]; then
        preview="true"
        shift
    fi

    expression=$1
    replacement=$2
    shift 2

    for file; do
        if [ -f "$file" ]; then
            found="true"
            if [ "$preview" == "true" ]; then
                echo mv -i -- "${file}" "${file/$expression/$replacement}"
            else
                mv -i -- "${file}" "${file/$expression/$replacement}"
            fi
        fi
    done

    if [ "$found" != "true" ]; then
        echo >&2 "Couldn't find files with the specified wildcard"
        exit 1
    fi
fi
    
por 17.11.2016 / 13:34