2012-04-28 14 views
17

私の現在の場所のサブディレクトリを繰り返し処理し、各ファイルを別々にgzipしたいと考えています。ディレクトリ内のファイルをビュンのために、私はbash内のすべてのサブディレクトリ内のすべてのファイルをgzipにする方法

for file in *; do gzip "$file"; done 

を使用するが、これは単に現在のディレクトリとカレントディレクトリのないサブディレクトリ上で動作することができます。上記のステートメントを書き直して、すべてのサブディレクトリ内のファイルも圧縮できるようにするにはどうすればよいですか?

答えて

41

ループまたはfindgzip以上のものは必要ない:

find . -type f ! -name '*.gz' -exec gzip "{}" \; 

これは名前つまり(.gz拡張子で終わらない、現在のディレクトリに、以下のすべての通常のファイルを検索します、まだ圧縮されていないすべてのファイル)。各ファイルに個別にgzipを呼び出します。 user unknownからのコメントに基づいて


編集、:

あなたが見ることができるように中括弧({})は-exec次のコマンドに、単一の単語として、直接渡されたファイル名に置き換えていますここでは:

$ touch foo 
$ touch "bar baz" 
$ touch xyzzy 
$ find . -exec echo {} \; 

./foo 
./bar baz 
./xyzzy 
+2

あなたの最後の文章はよくある誤った情報です。 Findは、ファイル名の開始位置と終了位置を認識します。それ自体、空白や改行やその他の面白いことには何の問題もありません。したがって '-exec gzip {}'は単一のファイル名でgzipを呼び出し、空白を区切り文字として解釈できる中間シェルが呼び出されないので、gzipはファイル名全体を受け取ります。検索のマンページのヒントは古くなっているように見えます:あなたのシェルは見つけるためにそれを渡す前に{}を解釈しようとする可能性がありますが、そのようなシェルは何年も見られていません(http://unix.stackexchange.com/q/ 8647/4485)。 –

+1

あなたは毎日何か新しいことを学びます。レッスンありがとう! –

+2

+1 * .gzファイルの除外 – GuruM

5
find . -type f | while read file; do gzip "$file"; done 
+1

ファイルにスペースやその他の特殊文字が含まれる場合はどうなりますか?それは 'のために働いていない'がある – c00kiemon5ter

+1

@ c00kiemon5ter答えは動作しますが、不完全かもしれないdownvoteに値する? SOによると、「あなたが悪意のあるように駄目で無駄に費やされた投稿、あるいは明らかに、おそらくは間違っている回答に出くわすと、あなたの下垂体を使用してください。この答えはそれらのもののどれもありません。不完全で、やや汚いですが、間違っていません。あなたはおそらくupvoteプロセスがその通行料を払ってコメントを残すようにしておくべきでしょう。 –

+0

イモ、答えは間違っています。 Farshidはファイルに特殊文字が含まれていないとは決して指定しなかったので、あなたの答えは質問の特別な場合にのみ答えます。あなたは 'find .. |読んでいる間。あなたの答えを訂正すれば、私は最初にupvoteするでしょう。しかし、間違った(イモ)回答を促進するように私に依頼しないでください。 – c00kiemon5ter

11

私は同じことをしますが、より短いです。

関連する問題