/tmp
に2つのファイルがあるとします。
root@ubuntu:~# touch /tmp/hello.{pyc,py}
root@ubuntu:~# ls /tmp/
hello.py hello.pyc
[co]オプションを指定してrm -rf
コマンドを実行しましょう
root@ubuntu:~# rm -rf /tmp/hello.py[co]
root@ubuntu:~# ls /tmp/
hello.py
誰かがここで何が起こっているのか説明してもらえますか? [co]
パラメーターとは何ですか?他の拡張機能でどのように機能させることができますか? foo.js
およびfoo.coffee
ファイルがあるとします。rm -rf /tmp/foo.coffe[co]
のようなことをして、/tmp/foo.js
を削除できますか?
[co]
はrm
コマンドのパラメーターではありません-これはShell globで、セットの単一文字に等しいパターンに一致します[co]
-その他つまり、ファイル名の末尾のc
またはo
aのいずれかに一致します。 man bash
から:
[...] Matches any one of the enclosed characters
foo.coffee
とfoo.js
の両方に一致させるには、接尾辞に共通の部分文字列がまったく含まれないため、できることはfoo.*
で、これはanyに一致しますfoo.
で始まるファイル名代わりにブレース展開を使用できます.
rm foo.{coffee,js}
これはパラメーターではなく、文字のコレクション(または「シェルグロブ」)です。これは同じです:
rm -rf /tmp/hello.py[co]
と同じです
rm -rf /tmp/hello.pyc
rm -rf /tmp/hello.pyo
同様の...
rm -rf /tmp/hello.py[c-o]
ASCIIの順序に従って、/tmp/hello.pyc
から/tmp/hello.pyo
までのすべてを削除します。
rm -rf /tmp/hello.py[ab][cd]
削除します...
rm -rf /tmp/hello.pyac
rm -rf /tmp/hello.pyad
rm -rf /tmp/hello.pybc
rm -rf /tmp/hello.pybd
たとえば、foo.jsファイルとfoo.coffeeファイルがありますが、
rm -rf /tmp/foo.coffe[co]
のようなものを実行して/tmp/foo.js
を削除できますか。
かなり派手なメソッドを作成できますが、これらの2つのファイルについては、それぞれに1つのコマンドでそれらを削除するだけです。これらの2つのファイルにできるだけ近づける別の例...
rm /tmp/foo.[cj]*
このようなファイルを削除します...
rm /tmp/foo.c*
rm /tmp/foo.j*
したがって、これらの2つのファイルだけでなく、はるかに多くのものが含まれます。
これは、bashのワイルドカード*
および?
...に類似したシェルグロブです。ファイル名パターン*.[co]
は、.c
または.o
で終わるすべてのファイル名に一致します。
*.[co]
と*.c *.o
または*.{c,o}
との違いは、ディレクトリに*.o
ファイルが存在しない場合、後者の2つのパターンがダミー.o
に展開されることです。 *.[co]
バージョンはサポートしません。
シェルグロブは、大文字と小文字を区別しない方法でファイル操作を行うのに役立ちます。たとえば、ファイル名がjpg
、JPG
、Jpg
、JPg
などで終わるファイルの束があり、すべてを削除する場合それらは、あなたがすることができます:
rm *.[Jj][Pp][Gg]