web-dev-qa-db-ja.com

bashのすべてのサブディレクトリ内のすべてのファイルをgzipする方法

現在の場所のサブディレクトリ間で繰り返し処理を行い、各ファイルを個別にgzipしたい。ディレクトリ内のファイルを圧縮するには、次を使用します

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

ただし、これは現在のディレクトリでのみ機能し、現在のディレクトリのサブディレクトリでは機能しません。上記のステートメントを書き換えて、すべてのサブディレクトリ内のファイルも圧縮できるようにするにはどうすればよいですか?

21
Farshid

ループやfindおよびgzip以外は必要ありません。

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

これは、名前が.gz拡張子で終わらない現在のディレクトリ内およびその下のすべての通常ファイル(つまり、まだ圧縮されていないすべてのファイル)を見つけます。各ファイルでgzipを個別に呼び出します。


user unknownからのコメントに基づいて編集します:

中括弧({})はファイル名に置き換えられます。このファイル名は、次のように-execに続くコマンドに単一のWordとして直接渡されます。

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

./foo
./bar baz
./xyzzy
50
Adam Liss

gzip -r ./これは同じことをしますが、短いです。

35
Supernormal
find . -type f | while read file; do gzip "$file"; done
5
Tim Pote