파일 확장자를 재귀적으로 찾고 변경하는 Bash 스크립트

파일 확장자를 재귀적으로 찾고 변경하는 Bash 스크립트

특정 확장자(예: 또는 )를 가진 디렉터리에 있는 .png모든 파일의 파일 확장자를 변경하는 작은 스크립트를 작성하고 싶습니다 .gif.

내 생각에는 스크립트가 실행될 때 두 개의 매개 변수만 필요하다는 것입니다. 첫 번째는 변경하려는 확장자이고 두 번째는 변경하려는 확장자입니다.

처음에는 이를 사용하여 대상 디렉터리를 가져올 것이라고 생각했지만 read너무 복잡해져서 현재 디렉터리에서 작동하도록 만들었습니다. Debian 9를 실행 중이므로 이 rename명령을 사용할 수 없습니다.

이는 고정 콘텐츠(txt에서 rdf까지)에 적용됩니다.

$ find -depth -name "*.txt" -exec sh -c 'mv "$1" "${1%.txt}.rdf"' _ {} \;

그런데 전달된 매개변수를 상속받는 변수 내용의 확장자를 어떻게 변경하는지 모르겠습니다. 기본적으로 $1 $2 이지만 다음과 같이 변경하면 작동하지 않습니다.

$ find -depth -name "*.$1" -exec sh -c 'mv "$1" "${1%.$1}.$2"' _ {} \;

이 예에서는 일치하는 모든 파일의 끝에 . 내가 여기서 무엇을 놓치고 있는 걸까요?

답변1

#!/bin/sh

find . -depth -name "*.$1" -exec sh -c '
    from=$1
    to=$2
    shift 2
    for pathname do
        mv "$pathname" "${pathname%.$from}.$to"
    done' sh "$1" "$2" {} +

이를 통해 내부 스크립트는 변경할 경로 이름 목록과 함께 파일 이름 접미사를 인수로 사용할 수 있습니다. 내부 스크립트에서는 두 개의 접미사를 추출하여 매개변수 목록 밖으로 이동한 다음 find.

덜 효율적입니다( sh -c경로 이름 배치를 반복하는 대신 경로 이름당 한 번 호출됨):

#!/bin/sh

find . -depth -name "*.$1" -exec sh -c 'mv "$3" "${3%.$1}.$2"' sh "$1" "$2" {} ';'

참고로, 내부 스크립트의 0번째 인수로 sh또는 기타 관련 이름을 사용하는 습관을 들이세요. find-sh이 매개변수는 스크립트의 오류 메시지에 사용되며 _경우에 따라 오류 메시지의 소스가 혼동될 수 있습니다.

관련 정보