특정 확장자(예: 또는 )를 가진 디렉터리에 있는 .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
이 매개변수는 스크립트의 오류 메시지에 사용되며 _
경우에 따라 오류 메시지의 소스가 혼동될 수 있습니다.