web-dev-qa-db-ja.com

「rm -rf filename [co]」コマンドで[co]はどういう意味ですか?

/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を削除できますか?

15
aneeshep

[co]rmコマンドのパラメーターではありません-これはShell globで、セットの単一文字に等しいパターンに一致します[co]-その他つまり、ファイル名の末尾のcまたはo aのいずれかに一致します。 man bashから:

[...]  Matches any one of the enclosed characters

foo.coffeefoo.jsの両方に一致させるには、接尾辞に共通の部分文字列がまったく含まれないため、できることはfoo.*で、これはanyに一致しますfoo.で始まるファイル名代わりにブレース展開を使用できます.

rm foo.{coffee,js}
34
steeldriver

これはパラメーターではなく、文字のコレクション(または「シェルグロブ」)です。これは同じです:

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つのファイルだけでなく、はるかに多くのものが含まれます。

16
Rinzwind

これは、bashのワイルドカード*および? ...に類似したシェルグロブです。ファイル名パターン*.[co]は、.cまたは.oで終わるすべてのファイル名に一致します。

*.[co]*.c *.oまたは*.{c,o}との違いは、ディレクトリに*.oファイルが存在しない場合、後者の2つのパターンがダミー.oに展開されることです。 *.[co]バージョンはサポートしません。

シェルグロブは、大文字と小文字を区別しない方法でファイル操作を行うのに役立ちます。たとえば、ファイル名がjpgJPGJpgJPgなどで終わるファイルの束があり、すべてを削除する場合それらは、あなたがすることができます:

rm *.[Jj][Pp][Gg]
1
delt