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
。