ファイル名を変更するためのシェルスクリプト

ファイル名を変更するためのシェルスクリプト

シェルスクリプトがあります。

#!/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を使用してディレクトリ内の特定の拡張子を持つファイルの生成を監視する方法

おすすめ記事