シェルスクリプトがあります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
最後に文字列を追加します。.PK2
name
.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 をビルドします。 targetall
とforce
are 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%?}}
。1
dest