[コマンド]findの[ -exec {} \; ]オプション と [ -exec {} + ] オプションは何?
findの[ -exec {} \; ]オプション と [ -exec {} + ] オプションがなんなのかメモ
よく人のブログで見かけていた -exec なんちゃらがなにか良くわからなかったので調べた
そもそも-execとは
findの検索結果の結果を渡して別のコマンドを実行するためのもの。
結果xargsと似ている(速度的にはxargsのほうが早いらしいので意味がなければこちらでよさそう)
さらにxargsと同じ処理と思われるのは {} +のほう。
リファレンスを見る
まずは
man find
結果
-exec utility [argument ...] ; True if the program named utility returns a zero value as its exit status. Optional arguments may be passed to the utility. The expres- sion must be terminated by a semicolon (``;''). If you invoke find from a shell you may need to quote the semicolon if the shell would otherwise treat it as a control operator. If the string ``{}'' appears anywhere in the utility name or the arguments it is replaced by the pathname of the current file. Utility will be executed from the directory from which find was executed. Utility and arguments are not subject to the further expansion of shell patterns and constructs. -exec utility [argument ...] {} + Same as -exec, except that ``{}'' is replaced with as many pathnames as possible for each invocation of utility. This behaviour is similar to that of xargs(1).
よくわからないのでそのままgoogle翻訳(汗
-execユーティリティ[引数...]; ユーティリティという名前のプログラムが終了するようにゼロの値を返す場合は真 ステータス。オプションの引数は、ユーティリティに渡すことができる。エクスプレッション (; '' ``)シオンは、セミコロンで終了する必要があります。あなたが見つけ呼び出す場合 シェルからあなたはシェルが希望の場合、セミコロンを引用する必要があるかもしれません そうでなければ制御演算子として扱う。もし文字列 `` {} '' ユーティリティ名の任意の場所に表示されるか、引数がそれが交換される 現在のファイルのパス名によって。ユーティリティは以下から実行されます 見つけ、そこからディレクトリが実行されました。ユーティリティと引数は シェルのパターンと構造物の更なる拡大を受けない。 -execユーティリティ[引数...] {}+ ことを除いて、-execと同じ``{} ''のような多くのパス名に置き換えられます ユーティリティの各呼び出しのために可能な限り。この動作は似ています xargsのと(1)。
まずそもそも-exec {} \; のバックスラッシュは;がコマンドか判断がつかないためにエスケープしているだけのよう。
なので意味は無いが-exec {} \+ も有効。
やはり-exec {} + と xargs はリファレンス上も同じということらしい。
動作確認
下記2つは同等の結果となる例。
拡張子がrbのファイルの中で文字列aiueoが含まれるファイルを列挙
-exec {} + 実行
find . -name "*.rb" -exec grep aiueo {} +
xargs 実行
find . -name "*.rb" | xargs grep aiueo
結果はどちらも
./test1.rb:aiueo ./test2.rb:aiueo
※test1,test2どちらもaiueoの文字が含まれているrubyファイル
この状態で
-exec {} \; 実行
find . -name "*.rb" -exec grep aiueo {} \;
結果
aiueo aiueo
あれ、ファイル名がない・・・・・パスがないのか。これが違い
再度、工夫してチャレンジ
-exec {} + 実行 ※に/dev/nullを指定(複数のファイルが指定された事になる)
find . -name "*.rb" -exec grep aiueo /dev/null {} \;
結果
./test1.rb:aiueo ./test2.rb:aiueo
これでファイル名もでた。
結論
-exec {} + はファイルをまとめて実行する(グループ実行)➡ 全ファイルのパスに置き換えられる
-exec {} \; はファイルを1つずつ実行する(単体実行)➡ファイルパスにならない
ので、ファイル名が欲しい場合は -exec {} + を使うと良い、もっというと速度もあるxargsを使うと良さそう
であってるかな・・・・
ついでに
さらにもっというとmacの場合はmdfindを使うのが一番良い!
さっきの例でいうと
mdfind . -onlyin aiueo
結果
/Users/[user-name]/sample/test1.rb /Users/[user-name]/sample/test2.rb
親切で便利!そして速い!
その他おすすめの備忘録
- [AndroidStudio]便利な共通部品ライブラリのApacheCommonsLangを導入
- [Android]logcatコマンドの出力する値をアプリから取得する方法
- [Android]高速エミュレータ『GenyMotion(ジェニーモーション)』をインストール
- [FuelPHP]simpleauthのsaltの可変指定について
- [git]バージョン管理svnからgitへの移行手順メモ※コミット情報保持
- [VIM]vim-quickrunでjavaプログラムを実行する
- [Android]CollapsingToolbarLayoutで影グラデーションが表示しない不具合対応
- [Vim]:grepの使い方(quickfixリストの移動方法など)
- [Rails][Vagrant]Vagrantの rails server で起動しているアプリケーションにローカルPCからブラウザアクセスする
- [Android]アプリリリース ソーシャルタイマー 〜 SNS予約投稿 〜
coffee-break
Don't write code that useless.
1日5杯はコーヒー、カフェオレ飲みます。狭心症のため安静にします☆松本 雄貴
Kotlinでサービスリリース目指す!
iOSでチャットアプリ作成中。自然言語解析LSIを習得中
Mac / Android・iOS / Rails / Oracle
2017年 Lpic L2取得
2012年 Android技術者資格取得
2010年 OracleMasterGold10g取得
2008年 CCNAQiitaもたまに投稿
https://qiita.com/y-matsumoto東京近郊で常駐開発探してる方はこちらよりご連絡ください
SES企業でパートナー会社を探している企業様はこちらよりご連絡ください
スプリットカメラ iOS / Android
音声認識で聞いた日付から曜日当てアプリ Android
ソーシャルタイマー Android
カテゴリー
- ActiveRecord (2)
- Android (52)
- AndroidStudio (10)
- Ansible (1)
- AWS (1)
- Bash (18)
- Blog (7)
- BootStrap (1)
- CentOS (16)
- Chef (1)
- css (2)
- Eclipse (5)
- error (1)
- Facebook (2)
- Firebase (1)
- FuelPHP (16)
- Git (22)
- GitHub (3)
- Gradle (2)
- GraphAPI (1)
- Grunt (1)
- heroku (2)
- illustrator (1)
- iOS (17)
- Java (4)
- Jenkins (1)
- jQuery (3)
- Kotlin (2)
- Mac (22)
- nginx (1)
- Node.js (3)
- peco (1)
- php (5)
- Python (1)
- Rails (16)
- Ruby (11)
- shell (1)
- SNS (1)
- Swift (2)
- tmux (2)
- Vagrant (6)
- Vim (6)
- windows (2)
- WordPress (3)
- zsh (4)
- フリーランス (1)
- ライブラリ (1)
- 勉強会 (2)
- 宣伝 (1)
- 未分類 (2)
最近の投稿
- [MAC]HighSierraでgitプッシュエラー「Unable to negotiate with xxx.xxx.xxx.xxx port xx: no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se fatal: Could not read from remote repository.」
- [iOS]iOS11からFacebook,Twitter連携(シェアなど)廃止の対応方法
- [iOS]速報2017AppleSpecialEventのiOS11、iPhone8など発表内容について
- [iOS][Firebase]The default Firebase app has not yet been configured. Add `[FIRApp configure];
- [iOS]2017年9月リリースのiOS11で開発者が対応するべきこと
- 今人気の現金化サービスCASH(キャッシュ)を使ったレビュー
- [Pandoc][Mac]pandocでmarkdownからwordファイル作成
- [Android]映画サマーウォーズの聞いた日付(誕生日)から曜日当てをアプリ音声認識で簡単に実現
- [Android]起動しているActivityを取得するadb shell コマンド
- [Android][Kotlin]kotlin学習で参考になるサイト一覧
2023年10月 月 火 水 木 金 土 日 « 5月 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 アーカイブ
- 2018年5月
- 2017年9月
- 2017年8月
- 2017年7月
- 2017年6月
- 2017年5月
- 2017年2月
- 2017年1月
- 2016年12月
- 2016年7月
- 2016年6月
- 2016年1月
- 2015年12月
- 2015年11月
- 2015年10月
- 2015年9月
- 2015年8月
- 2015年7月
- 2015年6月
- 2015年5月
- 2015年4月
- 2015年3月
- 2015年2月
- 2015年1月
- 2014年12月
- 2014年11月
- 2014年6月
- 2014年5月
- 2014年4月
- 2014年3月
- 2014年2月
- 2014年1月
- 2013年12月
- 2013年11月
- 2013年9月
- 2013年8月
- 2013年7月
- 2013年6月
- 2013年5月
- 2013年4月
- 2013年3月
- 2013年2月
- 2013年1月
- 2012年12月
- 2012年10月
- 2012年5月
- 2010年6月
エントリ