
シェルスクリプトがあります。
#!/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の代わりに$1
inを使う理由はありますか?グローバルパターンを意図的にスクリプトに渡していますか?for name in /path/$1.PK1
for 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を使用してディレクトリ内の特定の拡張子を持つファイルの生成を監視する方法