web-dev-qa-db-ja.com

同じベース名のファイルがある場合はrm

次のファイルがあるとします。

foo.coffee
foo.js
bar.js

対応するrm *.jsファイルがある場合に.coffeeを簡単に行う方法はありますか?例では、そのようなコマンドはfoo.jsを削除します:

foo.coffee
bar.js

再帰的なrm -rを行う必要があるので、ある種のrmラップを探しています。

3
mreq

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 の場合)。
  • 引用は完璧であることに注意してください。名前にスペースや面白い記号が含まれているファイルに関しては、すべて100%安全です。

テストのために、echormの前に置く必要があります。

    [[ -f $coffee ]] && echo rm -v -- "$f"

コマンドをエコーするだけで、何も削除しません。問題がなければ、echoを削除します。

楽しい!

5
gniourf_gniourf

次のスクリプトを作成します(私は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を実行します。

2
Eric Carvalho