Ubuntuターミナルで以下のコードを使用すると、正常に動作します。
rm !(*.sh) -rf
しかし、同じ行コードをシェルスクリプト(clean.sh)に配置して、ターミナルからシェルスクリプトを実行すると、エラーがスローされます。
clean.shスクリプト:
#!/bin/bash
rm !(*.sh) -rf
私が得るエラー:
./clean.sh: line 2: syntax error near unexpected token `('
./clean.sh: line 2: `rm !(*.sh) -rf'
手伝ってくれますか?
rm !(*.sh)
はextglob
構文です。これは、.sh
拡張子を持つファイルを除くすべてのファイルを削除することを意味します。
インタラクティブbash
インスタンスでは、シェルオプションextglob
がオンになっています。
$ shopt extglob
extglob on
スクリプトがサブシェルで実行されているので、スクリプトの先頭にこれを追加してextglob
を有効にする必要があります。
shopt -s extglob
したがって、スクリプトは次のようになります。
#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)
編集:
.sh
拡張ファイルを除くすべてのファイルを削除するには、GLOBIGNORE
を使用します(extglob
を有効にしたくない場合):
#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *
例:
$ ls -1
barbar
bar.sh
Egg
foo.sh
spam
$ GLOBIGNORE='*.sh'
$ rm *
$ ls -1
bar.sh
foo.sh
わかりました、それはクロスポストですが、答えを書かなければなりません。 ;)
代わりにfind
を使用できます
find . -maxdepth 1 ! -name '*.sh' -exec rm -rf {} \;
extglob
をオンにする必要があります。
shopt -s extglob