次のファイルがあるとします。
foo.coffee
foo.js
bar.js
対応するrm *.js
ファイルがある場合に.coffee
を簡単に行う方法はありますか?例では、そのようなコマンドはfoo.js
を削除します:
foo.coffee
bar.js
再帰的なrm -r
を行う必要があるので、ある種のrm
ラップを探しています。
bash の少し(すべてのベストプラクティスを使用!):
shopt -s nullglob
for f in *.js; do
coffee=${f%.js}.coffee
[[ -f $coffee ]] && rm -v -- "$f"
done
nullglob
は シェルのオプションの動作 なので、拡張子js
のファイルがない場合、*.js
は空の文字列に展開されます。.js
を削除し、変数coffee
の.coffee
に置き換えます。rm
は-v
スイッチ(詳細)と共に使用され、何が起こっているかを確認できます。rm
は、ハイフンで始まるファイルがある場合に備えて、オプションの終わりを示す--
とも使用されます。その場合、rm
は混乱し、オプションを解釈します。[[ ... ]]
構文は条件付き構文であり、 条件式 を使用します。堅牢な二重角かっこ[[
を使用しており、単一の[
ではないことに注意してください。非常に良い習慣( bash の場合)。テストのために、echo
をrm
の前に置く必要があります。
[[ -f $coffee ]] && echo rm -v -- "$f"
コマンドをエコーするだけで、何も削除しません。問題がなければ、echo
を削除します。
楽しい!
次のスクリプトを作成します(私はremove.shと呼びます)。
#!/bin/bash
if [ -z "$3" ]; then
echo "Usage: $0 <directory> <extension-to-remove> <conditional-extension>"
exit 1
fi
if [ ! -d "$1" ]; then
echo "Invalid directory."
exit 1
fi
for FILE in $(find $1 -name "*.$3"); do
rm -v ${FILE%.$3}.$2
done
次に、remove.sh <directory> js coffee
を実行します。