ファイルシェルスクリプトの移動

ファイルシェルスクリプトの移動

シェルスクリプトがあります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

2番目のループは、他のファイルセットに対して同様の操作を実行します。

変数拡張は、変数に格納された値の末尾から文字列を削除し、結果の${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 をビルドします。 targetallforceare 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

関連情報