와일드카드 패턴과 두 개의 추가 매개변수를 사용하여 스크립트를 어떻게 호출합니까?

와일드카드 패턴과 두 개의 추가 매개변수를 사용하여 스크립트를 어떻게 호출합니까?

여러 파일의 이름을 바꾸는 코드는 다음과 같습니다.

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

"pattern"과 "replace"를 $2와 $3로 어떻게 바꾸나요?

이 코드는 작동하지 않습니다:

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

다음 3가지 매개변수를 사용하여 이름을 바꾸려고 했습니다. ( file_*.jpg jpg bak결과는 *.jpg모든 파일의 이름을 *.bak파일로 바꾸는 것이어야 합니다.) 그러나 그것이 하는 일은 다음과 같습니다. ( mv -i file_01.jpg file_01.jpg따라서 두 mv 매개변수가 모두 동일하고 더 많은 파일이 있더라도 첫 번째 파일에서 중지되므로 이름이 바뀌지 않습니다 *.jpg.) jpgand 대신 bash 스크립트에 and를 수동으로 입력하면 작동합니다.bak$2$3

답변1

다음을 사용하여 스크립트를 호출합니다.

./script file_*.jpg jpg bak

그러나 *스크립트에 전달되기 전에 확장됩니다. files 가 있고 file_1.jpg폴더 에 다음이 있다고 가정 file_2.jpg합니다 .file_3.jpg

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

이는 ${1} = file_1.jpg, ${2} = file_2.jpg및 을 의미합니다 ${3} = file_3.jpg.

${1} = jpg(귀하의 예에서는) 다음 과 같이 스크립트를 작성하는 것이 더 나을 수 있습니다 ${2} = bak. 그런 다음 이러한 변수를 스크립트에 저장하고 호출하여 shift 2제거한 후 다음 명령을 사용하여 모든 위치 매개변수를 반복할 수 있습니다.

for file; do
    # do something
done

답변2

@pfnuesel과 @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

관련 정보