私は基本的に次のbashコマンドを実行したいのですが、tcshで:
rm !(file1)
ありがとう
ls -1
(小文字の L ではなくナンバーワンです) を使用して、1 行に 1 つのファイルをリストし、 を使用して ( ) に完全に一致する行grep -vx <pattern>
を除外し、コマンドに. 例えば、-v
-x
<pattern>
xargs
rm
ls -1 | grep -vx file1 | xargs rm
のバージョンがこのオプションをgrep
サポートしていない場合-x
は、アンカーを使用できます。
ls -1 | grep -vx '^file1$' | xargs rm
rm
任意の数の引数を取らないコマンド以外でこれを使用するには、引数が 1 つずつ処理されるように-n 1
オプションを追加することを忘れないでください。xargs
ls -1 | grep -vx '^file1$' | xargs -n 1 rm
find
の-name
オプションを使用して否定によってパラメーターを指定することもできると思います。つまり、find
ユーティリティ自体が のような式をサポートしている可能性が!(file1)
ありますが、結果を にパイプする必要がありますxargs
。
tcsh には、^
glob パターン用の特別な構文があります (csh、sh、または bash ではサポートされていません)。glob パターンの前に を付けるとそれが無効になり、パターンに一致しない^
すべてのファイル名に一致するようになります。
tcshマニュアルを引用:
glob パターン全体を `^' で否定することもできます:
> echo * bang crash crunch ouch > echo ^cr* bang ouch
単一のファイル名はグロブ パターンではないため、^
プレフィックスは適用されませんが、たとえば、最初の文字を角かっこで囲むことで、グロブ パターンに変換できます。
したがって、この:
rm ^[f]ile1
以外の現在のディレクトリ内のすべてのファイルを削除する必要がfile1
あります。
echo
最初にコマンドを使用して、使用する前にこれをテストすることを強くお勧めします。
echo ^[f]ile1
または、 をCtrl-X *押す前に を使用して、パターンをファイルのリストに展開しますEnter。
更新: bash は同様の機能をサポートしているが、構文が異なることを知りました。bash では、パターンに一致しない!(PATTERN)
ものすべてに一致します。これは、シェル オプションが有効になっていないと認識されません。tcsh の構文とは異なり、パターンは単一のファイル名にすることができます。これはあなたが求めていることとは関係ありませんが、bash に切り替えることにした場合に役立つ可能性があります。extglob
^
zsh にはおそらく似たようなものがあります。