2つのファイルを除いてすべて削除

2つのファイルを除いてすべて削除

2つのファイルを除いて、フォルダ内のすべてのアイテムを削除したいと思います。

exec.js
.git

私はこれを見つけました:

rm !(exec.js|.git)

これはCLで機能しますが、shファイルに保存して次のように呼び出したい場合は、次のようにしますbash file.sh

test.sh: line 1: syntax error near unexpected token `('
test.sh: line 1: `rm !(exec.js|.git)'

どんなアイデアがありますか?

答え1

あなたはする必要があります

shopt -s extglob

スクリプト内部。

Bash構成は、対話型シェルに対してこの機能を自動的にオンにすることができます(おそらく状況に合った完成のためにbash-completionパッケージをロードしたため)。スクリプト内で手動でオンにする必要があります。

また、スクリプトが#!/bin/bash(または同様のバリエーションで始まっていることを確認してください#!/usr/bin/env bash。)そうしないと、この構文をサポートしていない他のシェルで実行される可能性があります。

たとえば、このスクリプトはいくつかのファイルを生成し、保持したい2つのファイルを除いてすべてを削除します。

$ cat x
#!/bin/bash

shopt -s extglob

touch f1 f2 f3 exec.js .git foo bar

echo Before: $(ls -A)

rm !(exec.js|.git)

echo After: $(ls -A)

実行中:

$ bash x
Before: .git bar exec.js f1 f2 f3 foo x
rm: cannot remove '.': Is a directory
rm: cannot remove '..': Is a directory
After: .git exec.js

とを使用すると.エラーが発生します..。コマンドラインでも次のことがわかります。

$ touch f1 f2 f3 exec.js .git foo bar

$ rm !(exec.js|.git)
rm: cannot remove '.': Is a directory
rm: cannot remove '..': Is a directory

答え2

提案として追加できます。

GLOBIGNORE=.:..

shopt -s extglobエラーを避けるために後でrm: cannot remove '.': Is a directory

関連情報