펄없이 * nix에서 스크립트에 rename
사용할 수
일부 * nix에서는 사용 가능한 이름 바꾸기가 없으므로 다른 방법을 사용하여 이름 바꾸기를 수행해야합니다. 몇 년 전에 나는 zmv
여기서 훌륭하지만 반드시 사용할 수있는 것은 아니라고 제안 했습니다.
내장 및 sed를 사용하여 셸 스크립트를 신속하게 채울 수 있으므로 perl rename 스크립트와 매우 유사한 구문을 제공하지만 오류 처리 기능이 부족하지만 작업이 완료됩니다.
sedrename() {
if [ $# -gt 1 ]; then
sed_pattern=$1
shift
for file in $(ls $@); do
mv -v "$file" "$(sed $sed_pattern <<< $file)"
done
else
echo "usage: $0 sed_pattern files..."
fi
}
용법
sedrename 's/Beethoven\ -\ //g' *.mp3
before:
./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3
after:
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3
대상 폴더도 만들고 싶다고 가정 해보십시오 ...
여기에서는 그대로 mv
사용할 수없는 폴더를 만들지 않기 때문에 sedrename
상당히 작은 변화이므로 폴더 도 포함시키는 것이 좋을 것 같습니다.
abspath
새 폴더 구조를 포함하는 sed / rename 패턴에 대한 대상 폴더를 생성 할 수 있도록 유틸리티 기능 (또는 절대 경로)이 필요합니다.
abspath () { case "$1" in
/*)printf "%s\n" "$1";;
*)printf "%s\n" "$PWD/$1";;
esac; }
이를 통해 대상 폴더의 이름을 알 수 있습니다. 이름을 바꿀 때는 대상 파일 이름에서 사용해야합니다.
# generate the rename target
target="$(sed $sed_pattern <<< $file)"
# Use absolute path of the rename target to make target folder structure
mkdir -p "$(dirname $(abspath $target))"
# finally move the file to the target name/folders
mv -v "$file" "$target"
전체 폴더 인식 스크립트는 다음과 같습니다.
sedrename() {
if [ $# -gt 1 ]; then
sed_pattern=$1
shift
for file in $(ls $@); do
target="$(sed $sed_pattern <<< $file)"
mkdir -p "$(dirname $(abspath $target))"
mv -v "$file" "$target"
done
else
echo "usage: $0 sed_pattern files..."
fi
}
물론 특정 대상 폴더가없는 경우에도 여전히 작동합니다.
모든 노래를 폴더에 넣고 싶다면 ./Beethoven/
다음과 같이하십시오.
용법
sedrename 's|Beethoven - |Beethoven/|g' *.mp3
before:
./Beethoven - Fur Elise.mp3
./Beethoven - Moonlight Sonata.mp3
./Beethoven - Ode to Joy.mp3
./Beethoven - Rage Over the Lost Penny.mp3
after:
./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3
보너스 라운드 ...
이 스크립트를 사용하여 파일을 폴더에서 단일 폴더로 이동 :
일치하는 모든 파일을 모으고 현재 폴더에 저장하려고한다고 가정하면 다음과 같이 할 수 있습니다
sedrename 's|.*/||' **/*.mp3
before:
./Beethoven/Fur Elise.mp3
./Beethoven/Moonlight Sonata.mp3
./Beethoven/Ode to Joy.mp3
./Beethoven/Rage Over the Lost Penny.mp3
after:
./Beethoven/ # (now empty)
./Fur Elise.mp3
./Moonlight Sonata.mp3
./Ode to Joy.mp3
./Rage Over the Lost Penny.mp3
sed 정규식 패턴에 대한 참고 사항
이 스크립트에는 정규 sed 패턴 규칙이 적용되며 이러한 패턴은 PCRE (Perl Compatible Regular Expressions)가 아닙니다.
플랫폼에 따라 sed -r
또는 sed -E
플랫폼에 따라 확장 정규식 구문을 사용할 수 있습니다.
man re_format
sed 기본 및 확장 정규 표현식 패턴에 대한 전체 설명은 POSIX 호환 을 참조하십시오 .