여러 파일의 이름을 바꾸는 코드는 다음과 같습니다.
#!/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
.) jpg
and 대신 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