1

私は基本的に次のbashコマンドを実行したいのですが、tcshで:

rm !(file1)

ありがとう

4

2 に答える 2

2

ls -1(小文字の L ではなくナンバーワンです) を使用して、1 行に 1 つのファイルをリストし、 を使用して ( ) に完全に一致する行grep -vx <pattern>を除外し、コマンドに. 例えば、-v-x<pattern>xargsrm

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

于 2013-06-18T20:59:23.477 に答える
1

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 にはおそらく似たようなものがあります。

于 2013-06-18T21:55:02.347 に答える