파일 이름 바꾸기를 위한 쉘 스크립트

파일 이름 바꾸기를 위한 쉘 스크립트

쉘 스크립트가 있습니다.

#!/bin/bash
for name in /home/imp/imp/msgs/$1.PK1; do
    mv "$name" "${name%.PK1}.BRD" 2>/dev/null >/dev/null
done
for name in /home/imp/imp/msgs/$1.PK2; do
    mv "$name" "${name%.PK2}.MIX" 2>/dev/null >/dev/null
done

작동하지만 기존 파일에만 해당됩니다. 초기 스캔 후에 더 많은 *.PK1합계가 생성됩니다. *.PK2이 스크립트를 "루프"하고 나중에 생성된 파일의 이름을 바꾸길 원합니다. 가능합니까?

고쳐 쓰다:

이것이 내가 지금 가지고 있는 것입니다:

#!/bin/bash

while [ ! -z "$(ls *.PK1 *.PK2 2>/dev/null)" ]; do

for name in /home/imp/imp/msgs/$1.PK1; do
    mv "$name" "${name%.PK1}.BRD" 2>/dev/null >/dev/null
done
for name in /home/imp/imp/msgs/$1.PK2; do
    mv "$name" "${name%.PK2}.MIX" 2>/dev/null >/dev/null
done
sleep 1; done

그렇죠?

감사해요.

답변1

just 대신 $1in 을 사용할 이유가 있나요 ? 전역 패턴을 의도적으로 스크립트에 전달하고 있습니까?for name in /path/$1.PK1for name in /path/*.PK1

이러한 접미사가 있는 모든 파일과 새 파일이 나타나는 대로 캡처하려는 경우 Bash의 간단한 솔루션은 다음과 같습니다.

shopt -s nullglob
dir=/home/imp/imp/msgs
while true ; do
    for name in "$dir/"*.PK1; do
        mv "$name" "${name%.PK1}.BRD" 2>/dev/null >/dev/null
    done
    for name in "$dir/"*.PK2; do
        mv "$name" "${name%.PK2}.MIX" 2>/dev/null >/dev/null
    done
    sleep 1
done

추가 작업을 피하려면 (Linux에서) inotifywait다음과 같이 새 파일이 나타날 때까지 기다리는 것과 같은 방법을 사용할 수 있습니다. inotifywait를 사용하여 디렉터리에서 특정 확장자를 가진 파일 생성을 모니터링하는 방법

관련 정보