現在の場所のサブディレクトリ間で繰り返し処理を行い、各ファイルを個別にgzipしたい。ディレクトリ内のファイルを圧縮するには、次を使用します
for file in *; do gzip "$file"; done
ただし、これは現在のディレクトリでのみ機能し、現在のディレクトリのサブディレクトリでは機能しません。上記のステートメントを書き換えて、すべてのサブディレクトリ内のファイルも圧縮できるようにするにはどうすればよいですか?
ループや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
gzip -r ./
これは同じことをしますが、短いです。
find . -type f | while read file; do gzip "$file"; done