쉘 스크립트가 있습니다ren.sh
#!/bin/bash
/usr/bin/mv /home/imp/imp/msgs/$1.PK1 /home/imp/imp/msgs/$1.BRD
/usr/bin/mv /home/imp/imp/msgs/$1.PK2 /home/imp/imp/msgs/$1.MIX
잘 작동하지만 한 번에 2개의 파일만 이동할 수 있습니다( *.PK2
및 *.PK1
). 모든 기존 파일 *.PK1
과 파일을 및 파일 *.PK2
로 이동하고 싶습니다 .*.MIX
*.BRD
가능합니까?
답변1
예.
for name in /home/imp/imp/msgs/*.PK1; do
mv "$name" "${name%.PK1}.BRD"
done
for name in /home/imp/imp/msgs/*.PK2; do
mv "$name" "${name%.PK2}.MIX"
done
*.PK1
첫 번째 루프는 아래의 모든 파일을 반복 /home/imp/imp/msgs
하고 파일 이름 접미사를 .BRD
.
두 번째 루프는 다른 파일 세트에 대해 유사한 작업을 수행합니다.
변수 확장은 변수에 저장된 값의 끝에서 문자열을 제거한 ${name%.PK2}.MIX
다음 결과의 끝에 문자열을 추가합니다..PK2
name
.MIX
답변2
cat - <<\eof | make -f - SRCDIR="/home/imp/imp/msgs"
.PHONY:all force
all:$(wildcard $(SRCDIR)/*.PK[12]);
%.PK1:force;/usr/bin/mv "$@" "$(@:.PK1=.BRD)";
%.PK2:force;/usr/bin/mv "$@" "$(@:.PK2=.MIX)";
eof
cat 명령은 즉시 makefile을 빌드합니다. target all
및 force
are false => 타겟은 항상 재구축되며, 우리의 경우 mv
매번 실행됩니다. $(wildcard ...)
필요한 모든 파일의 목록을 만듭니다 *.PK1, *.PK2
.
답변3
set -- "BRD" "MIX"
for src in /home/imp/imp/msgs/*.PK[12]; do
eval "dest=\${src%.*}.\${${src#${src%?}}}"
/usr/bin/mv "$src" "$dest"
done
기본 아이디어는 "$@" 배열을 통해 src 파일 확장자의 매핑을 새 확장자로 저장하는 것입니다.
$src
포함 name.PK1
${src%.*}
포함 따라서 "name" "."으로 평가됩니다 name
${src#${src%?}}
.1
dest