質問: 同階層にあるディレクトリを検索しそれをzip化するコマンドを探していて検索、デバッグを行い使用しているのですが、このコマンドの認識はあっているでしょうか? ``` find . \! -name '*.zip' \! -name '.' -type d -exec zip -r {}.zip {} \; ``` これなのですが、 findの後に -nameオプションでzipがつくファイルを検索 -type dでディレクトリを検索 -execで検索したものに対してコマンドを実行 zip -r 出力ファイル名({}.zip, {}には検索にヒットしたものの名前が入る) 元ファイル名({}) \; 出力結果を改行して表示 だと理解しています。 こちら認識としてあっていますでしょうか? また、find . \! など、findのあとに来る\!の意味はなんなのでしょうか?? よろしくお願いいたします。
回答: \; は改行ではなくて、exec が ; が出てくるまでをコマンドとその引数と解釈するための区切り文字です。 ; の前の \ はシェルに対するエスケープです。(シェルが ; を解釈しないようにする) ! は次に続く式の否定です。真なら偽、偽なら真になります。 今回の場合は -name '.' なので、! がなければファイル名が . のものを検索ですが、! をつけるとファイル名が . でないものを検索することになります。 ! の前の \ もシェルに対するエスケープです。 find のオプションなどはたとえば以下を参照するといいと思います。 https://linuxjm.osdn.jp/html/GNU_findutils/man1/find.1.html シェルのエスケープについてわからないようでしたら、ここなどが参考になります。 http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231046/