globstarを使用できます。
globstar
シェルオプションが有効になって、あなたが必要とするすべてですgzip -vk **/*.{css,html}
。
Bashシェルには、globstar
を使用して再帰的なglobを作成できるオプションがあります**
。shopt -s globstar
有効にします。ただし、後で実行する他のコマンドに対してはそうしたくないのでgzip
、代わりにサブシェルでコマンドを実行できます。
このコマンドはgzip
、すべてのだ.css
と.html
任意のそのサブディレクトリのいずれかの現在のディレクトリ内のファイルを自分の(元のファイルを維持する、などのサブディレクトリ、-k
()、それはやっている何を言って-v
):
(shopt -s globstar; gzip -vk **/*.{css,html})
ファイル名の大文字と小文字を区別せずに一致させ、一部またはすべての文字が大文字になっている拡張子を含める場合は、nocaseglob
シェルオプションを有効にすることもできます。
(shopt -s globstar nocaseglob; gzip -vk **/*.{css,html})
;
2つのコマンドを分離し、外側のコマンドにより(
)
サブシェルで実行されます。サブシェルでシェルオプションを設定しても、呼び出し元のシェルでは設定されません。あなたがいる場合か有効にしたいglobstar
、あなたは実行することができますshopt -s globstar
。次に、コマンドを実行するだけです:
gzip -vk **/*.{css,html}
あなたは無効にすることができglobstar
てshopt -u globstar
。で現在有効になっているかどうかを確認できshopt globstar
ます。
使い方
このgzip
コマンドの動作の鍵は、シェルがコマンドを展開して、ディレクトリ階層内の各ファイルと一致する名前のリストを作成し、これらの各ファイル名を引数としてに渡すことgzip
です。
- ブレース展開は変わり
**/*.{css,html}
に**/*.css **/*.html
。
- そして、グロブ(現在のディレクトリの下にアクセス可能なファイルの名前に展開さにこれら二つのパターンを
**
のために、globstar
そのファイル名が何も(で構成さ)*
)指定された接尾辞(続く.css
か、.html
この場合)。
これは、名前がで始まる.
ファイルや、この方法で名前が付けられたディレクトリにあるファイルとは一致しません。そのようなHTMLファイルやCSSファイルはおそらくないでしょうし、もしそうなら、おそらくそれらを含めたくないでしょう。ただし、それらを含める場合は、必要に応じて明示的に一致させることができます。たとえば、に変更**/*.{css,html}
する**/{,.}*.{css,html}
と、開始するファイルが含まれますが.
、まだ存在するフォルダーは検索されません。
名前で始まるファイルと、名前で始まる.
ディレクトリ内のファイルの両方を.
含める場合、よりクリーンで簡単な方法がありdotglob
ます。シェルオプションを有効にします。
(shopt -s globstar dotglob; gzip -vk **/*.{css,html})
または、大文字と小文字を区別しないマッチング、および次で始まるファイル名のマッチングが必要な場合.
:
(shopt -s globstar nocaseglob dotglob; gzip -vk **/*.{css,html})
非常にまれですが、**
長すぎるものに拡張することは可能です。
あなたが持っている場合は、巨大なこの方法を指定されたファイルの数を、これは、それが長すぎるので、シェルはコマンドラインを構築することができないことを説明するエラーメッセージを表示して失敗することがあります。(数千のファイルがある場合でも、通常これは問題ではありません。)
gzip
まったく呼び出されないので、半分の仕事を得ることができません。
このエラーが発生した場合、あなたはそれを心配している場合、または、あなたが使用することができfind
て-exec
、どちらかとsteeldriverが記述する(と{} \;
)またはように私は(と以下の記述します{} +
)。
あなたは使うことができfind
て-exec
、アクションと+
効率化のために。
このgzip
コマンドは、圧縮する複数のファイルの名前の指定をサポートしています。しかし、このfind
コマンドはうまく機能し、多くのファイルがない限り遅くなりませんが、ファイルごとにgzip
1回コマンドを実行し ます。
find . \( -name \*.css -o -name \*.html \) -exec gzip -vk {} \;
これは機能し、間違いなく使用できます。(.
現在のディレクトリから検索します。それ以外に、steeldriverの非常に良い答えでコマンドを書く方法は実際には少し異なります。好きなスタイルを使用できます。)
また、find
複数のファイル名をgzip
必要な回数だけ渡して実行することもできます。これはほとんどの場合1回だけです。それを行うには、の代わりにを使用します+
\;
。+
引数には、直後に来る必要があります{}
。もしあれば、追加のファイル名にfind
置き換え+
ます。
find . \( -name \*.css -o -name \*.html \) -exec gzip -vk {} +
+
一致するファイルが少数しかない場合でも使用できgzip
ます。それらのファイルが多数ある場合は、ファイルごとに個別の呼び出しを行うよりも著しく高速です。
以下のようsteeldriverが言及、あなたが使用することができる-iname
代わりに-name
、名前が終わりのようなファイルと一致する.css
か.html
が異なる大文字と小文字を。これnocaseglob
は、globstar
上記のベースの方法で有効にすることに対応します。
最後に、おそらくで始まる一致するファイルまたはディレクトリがありません.
。ただし、その場合、find
自動的に含まれます。それらを除外したい場合(globstar
上で詳述した-basedの方法dotglob
がオフのときに起こるように)、次のことができます:
find . -not -path '*/.*' \( -name \*.css -o -name \*.html \) -exec gzip -vk {} +
globstar
上記で説明した- ベースの方法は、特に.
デフォルトであるため、で始まるディレクトリとファイルを除外する場合に記述が簡単です。
何をしていない行うには...
ファイル名には、パス区切り文字/
とヌル文字を除く任意の文字を含めることができます。奇妙なファイル名を壊す多くのテクニックが存在し、それらは通常常に機能するテクニックよりも複雑です。そのため、特定の状況では大丈夫だとわかっている(または知っていると思う)場合でも、それらを避けることをお勧めします。そしてもちろん、スペースを含む特別に扱われる可能性のある文字を含むファイル名がある場合は、それらを使用してはいけません。
を使用する場合、またはそれ以外の場合ではなく、改行の代わりにパスの間にヌル文字を配置するための同様のアクションを使用する場合、find
それを処理する別のコマンドに出力を安全にパイプすることができます。ファイル名には改行を含めることができます(ただし、意図的にファイルに名前を付けることはお勧めしません)。コマンドアクション-明示的なアクションを使用してfindコマンドを含む、それ以来、デフォルトでは-安全にパイプされたか、そうでない場合は、ファイルに対して実行する処理という別のコマンドに提供することができる出力を生成しません。-print0
find
-print
-print
アクションでfind
生成された出力は、-print0
安全にパイプされる可能性がありますxargs -0
(-0
フラグはxargs
、nullで区切られた入力を予期するように指示します)。
-r
設計どおりに動作します。man gzipから:ディレクトリ構造を再帰的に移動します。コマンドラインで指定されたファイル名のいずれかがディレクトリの場合、gzipはそのディレクトリに降りて、そこで見つかったすべてのファイルを圧縮します(または、gunzipの場合は解凍します)。(強調鉱山)