24

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

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

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

4

4 に答える 4

56

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
于 2012-04-28T13:35:42.540 に答える
54

同じことをしますgzip -r ./が、もっと短い方がいいです。

于 2014-03-06T12:41:41.870 に答える
6
find . -type f | while read file; do gzip "$file"; done
于 2012-04-28T13:34:04.667 に答える
0

トップポストにコメントすることはできませんが(まだ...)、「find」のマニュアルページで、一致が見つかったサブディレクトリでコマンドが実行されるため、-execDirの方が-execよりも安全であると読みました。 「find」が実行される親ディレクトリより。

正規表現を使用してサブディレクトリ内の特定のファイルを検索してzipする場合は、次を使用することをお勧めします。

find ./ -type f -name 'addRegexHere' -execdir gzip -k "{}" \;

正規表現が必要ない場合は、上記の再帰的なgzip呼び出しを使用してください(トラクションが得られた場合は、以下を参照してください)。

ソース

于 2021-10-08T22:31:55.293 に答える