現在の場所のサブディレクトリ間で繰り返し処理し、各ファイルを個別にgzipで圧縮したいと思います。ディレクトリ内のファイルを圧縮するために、私は使用します
for file in *; do gzip "$file"; done
ただし、これは現在のディレクトリでのみ機能し、現在のディレクトリのサブディレクトリでは機能しません。上記のステートメントを書き直して、すべてのサブディレクトリのファイルも圧縮するにはどうすればよいですか?
find
ループやand以外のものは必要ありませんgzip
:
find . -type f ! -name '*.gz' -exec gzip "{}" \;
これにより、名前が拡張子で終わらない現在のディレクトリ内およびその下のすべての通常のファイル.gz
(つまり、まだ圧縮されていないすべてのファイル)が検索されます。gzip
各ファイルを個別に呼び出します。
からのコメントに基づいて編集user unknown
:
中括弧({}
)はファイル名に置き換えられます。ファイル名は、次のコマンドに1つの単語として直接渡さ-exec
れます。
$ 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
トップポストにコメントすることはできませんが(まだ...)、「find」のマニュアルページで、一致が見つかったサブディレクトリでコマンドが実行されるため、-execDirの方が-execよりも安全であると読みました。 「find」が実行される親ディレクトリより。
正規表現を使用してサブディレクトリ内の特定のファイルを検索してzipする場合は、次を使用することをお勧めします。
find ./ -type f -name 'addRegexHere' -execdir gzip -k "{}" \;
正規表現が必要ない場合は、上記の再帰的なgzip呼び出しを使用してください(トラクションが得られた場合は、以下を参照してください)。