파일 쉘 스크립트 이동

파일 쉘 스크립트 이동

쉘 스크립트가 있습니다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다음 결과의 끝에 문자열을 추가합니다..PK2name.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 allforceare 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%?}}.1dest

관련 정보