findとxargsを利用したgrepでマッチしたファイルをパスで絞り込む方法

投稿者: Anonymous 現在、ファイルネームをfindコマンドで絞り込み、パイプでxargs grepして中身を検索したあとに、さらにその出力結果を、パスで絞り込むために、さらにパイプでgrepを繋いでいます。しかし、この方法は同じようなコマンドを二度使っているのでちょっと冗長で、もう少しいい方法がないかと考えています。 具体的には以下のようなコマンドです: $ find . -name “*.rb” | xargs grep “HogeHoge” | grep “app” findの使い方がこなれていないのも、上のように冗長になる要因ではあるかとは思いますが、できることならgrepの何らかのオプションで出来る方法があれば教えて下さい。あるいは、この発想自体が筋が悪く、findで対象パスを絞り込むべきならば、その方法を教えてください。 解決 ※ すっかり勘違いをしていました。 $ find . -type f -regex ".*app.*.rb" | xargs grep ‘HogeHoge’ でしょうか? 念の為、ディレクトリを grep しない様に -type f を find に付けておいた方が良いかと思います。 追記 0: ※ 追記ばかり多くてすみません -path, -name オプションと GNU find の -regex オプションの違いですが、 $ find…(Continue Reading)

browser-sync でカレントディレクトリ以下にないファイルも監視したい

投稿者: Anonymous カレントディレクトリの兄弟ディレクトリもbrowser-syncの監視対象にしたいです。 下記のコマンドで、兄弟ディレクトリにあるcssの変更も監視対象になると思ったのですが、cssの変更があっても反応しません。 dest-after>browser-sync start –server –files ../* 下記サイトで質問をしていた内容と関連した質問です。 https://teratail.com/questions/54590 下記の通り、回答に従いましたが、反応しませんでした。 dest-after>browser-sync start –server –files ‘../**/*’ 解決 browser-sync start –server –files ‘../**/*’ とすれば、親ディレクトリ以下の全てのファイルの変更を監視します。 –files に渡すパスは確かglobモジュールによって解釈されます。 パターンには数種の記法が使えますが、この場合は ** を使えばよいです。 これで、サブディレクトリ以下も再帰的にマッチします。 本題とずれますが、殆どの用途では browser-sync で提供しないファイルを監視する必要は無い、という事を申し添えておきます。 つまり、上記のようなことが必要になったならば、何か間違えている可能性が高いです。 追記: あまり詳しくないですが、Windows のシェルだとシングルクォーテーションではなく、ダブルクォーテーションを使うべきなのかもしれません。 –files “../**/*” のように。 回答者: Anonymous

helpを表示する際の終了コードはどのようにすべきか

投稿者: Anonymous Go言語でコマンドラインツールを書いているのですが、 一つ分からないことがあります。 コマンドのオプションに–helpを渡された場合、 コマンドの使い方のみ表示して終了するのが普通だと思いますが、 その際の終了コードはどのようにすべきでしょうか? GitHub上にあるいくつかのコマンドラインツールを試してみると、 peco、ghq、hubなどの終了コードは0、 jvgrep、gocode、hkなどの終了コードは2となっており、 0と2、どちらにすべきか分かりませんでした。 解決 そのコマンドが–helpというオプションを定義しているなら、指示されたオプション(ヘルプを表示する)を正しく実行したということで0にすべきだし、—-helpというオプションを定義しているわけではなくて、不正オプションが指示された場合helpメッセージを表示する仕様にしているなら、 指示が誤っているということで2にすればよいと思います。 全てを調べたわけではありませんが、例えばpecoコマンドは–helpオプションがあることが説明されていますし、jvgrepコマンドは–helpオプションがあるとは書かれていません。 回答者: Anonymous

CLIツールのベターパターン/アンチパターンを教えてください

投稿者: Anonymous 背景 PythonでCLIツールを作成しています。 aws-cliのような、外部サービスにアクセスするCLIツールです。以下のようにコマンドを実行します。 # ユーザusr1を登録 $ mycli register_user –user_id usr1 –user_info “{‘name’: ‘alice`}” # usr1,usr2,usr3に関する詳細情報を出力する $ mycli print_users –user_id usr1 usr2 usr3 コマンドライン引数のパースには、argparserモジュールを利用しています。 悩んでいること CLIツールのサブコマンドやオプションの設計に悩んでいます。 例えば、以下のような内容です。 サブコマンド名やオプション名の命名規則 アンダースコア区切り?ハイフン区切り? 複数の値を受け取ることができる(1個でもOK)オプション名は単数形?複数形? –user alice bob or –users alice bob オプション 使わない方が良い(競合しやすい)オプション名(-h?) その他 標準入力の使いどころ。ファイルで渡すか標準入力で渡すか 引数の順番(例:コピー元、コピー先の順) 質問 CLIツールに関して、ベターパターンやアンチパターン、標準や慣習が記載されているサイトがありましたら、教えていただきたいです。 「command line interface design pattern」で検索してみましが、私が期待するサイトが見つかりませんでした。 解決 アンチ(ベター)パターンがあるのか分かりませんが、Linuxでよく使われるオプション名などは 「linux command long…(Continue Reading)

manコマンドが使用してるpagerの確認方法

投稿者: Anonymous manコマンドで使われている pager が具体的にどのコマンドがどういうオプションで呼ばれているかを確認する方法はありますか? man manで確認しますと -P pager Specify which pager to use. This option overrides the MANPAGER environment variable, which in turn overrides the PAGER variable. By default, man uses /usr/bin/less -is. とのことなのですが、つまりMANPAGER→PAGERの環境変数を見て、どちらもなければ/usr/bin/less -isが使われていると推測するしかページャーの確認方法はないのでしょうか? 解決 ps で、man から呼び出されているコマンドを確認すると良いかと思います。 ps コマンドが f オプションをサポートする場合 $ ps f PID TTY STAT TIME COMMAND 15172 pts/1 Ss…(Continue Reading)

変数をファイルに保存・反映できるようにしたい

投稿者: Anonymous 概要 Linux環境でコマンド入力しているときに、変数をファイルに保存してあとでまた反映できるようにしたい 内容 hello=”hello world” # ファイルに保存する処理を何かしらする # ここで何かしらセッションとか切れて変数がリセットされる # ファイルに保存した変数を取り込む echo $hello # hello worldが表示される 保存されたファイル hello=hello world 上記のようにシェルでやるわけでなく直コマンド操作しているときに変数とかを一時的に保存とかできないのかなと思っているのですが、 何か簡単にできないでしょうか? ついでに、同じ変数名だと上書きするようにしたいです。 解決 回答  bashなど、declareが使えるshであれば、比較的簡単に変数をファイルに退避し、復元することができます。環境変数とsh変数も区別されます。 環境変数の退避 HELLO=’Hello, world!’ declare -p HELLO > hello.env #変数をファイルに退避 環境変数の復元 unset HELLO source hello.env #ファイルから変数を復元 printf “%sn” “${HELLO}” 復元結果 Hello, world! 回答者: Anonymous

sedで文字列を取り出すにはどうやればいいでしょうか?

投稿者: Anonymous “_app_”だけが必ず出現する”aaa bbb foo_app_bar ccc ddd”のような文字列から、sedを使って”foo_app_bar”を取り出したいです。 echo “aaa bbb foo_app_bar ccc ddd” | sed -n “s/.*([^s]*_app_[^s]*).*/1/p” を試してみましたが望みどおりに動作しませんでした。 どうやればいいでしょうか? 解決 echo “aaa bbb foo_app_bar ccc ddd” | sed “s/.*[[:space:]]([^[:space:]]+_app_[^[:space:]]+).*/1/” GNU sedでは上記のようにすれば”_foo_app_bar”を取り出せました。 以下はmetropolisさんからのコメントを元にしています。 BSD由来のsedの場合、s や [:space:] などの正規表現が利用できない様ですね。例えば echo”aaa bbb foo_app_bar ccc ddd” | sed ‘s/.*[ t](.*_app_[^ t]*)[ t].*/1/’ とか。 回答者: Anonymous

cmd.exe で Linux 用コマンドを打ってしまうことを想定した対策

投稿者: Anonymous Windows 10 上で cmd.exe と WSL のシェル (Bash) とを行き来していると、標準的なコマンドの差で躓くことが多々あります。私は Bash の方が良く使うので、特に cmd.exe 上で Linux 用のコマンドを誤って打ち込んでしまうことがあります。 たとえば cmd.exe 上で ls と打って「コマンドとして認識されていません」という趣旨のエラーが出て初めて dir を思い出すことが良くあります。他にも文字列を出力するつもりでecho foobar と打ってしまうと、cmd.exe 側にある同名の別コマンド echo が呼び出されてしまいます。 このような打ち間違いは、上のような例だとかわいいものですが、きっといつかもっと深刻な例を引き起こすのではないかと心配しています。 そこで、何かしら打ち間違い自体を阻止したり、打ち間違いがあっても実行前にエラーや確認メッセージが出るなどして最低限の影響で抑えられたりするような、技術的な解決法はないでしょうか? 「cmd.exe で操作するときは伸びをしてからにする」みたいな慣習的方法ではなく、機械による (半) 自動的な方法を探しています。使用頻度は cmd.exe の方が低いので、cmd.exe 側は多少操作が面倒になっても大丈夫です。cmd.exe を使うのは、たとえば Windows 側にインストールされた Go コンパイラを使いたいときなどです。 ただし cmd.exe 側のコマンドにあまり詳しくないのでそもそも「どっちでも動いてしまうようなコマンド」がどの程度あるのかも良く分かっておらず、この心配が杞憂の可能性もあるとは思っています。そうであればそのように回答頂ければ幸いです。 解決 すべての打ち間違いを網羅することは難しいと思うので、あらかじめ把握しているいくつかのコマンドで注意を促す方法を考えてみます。 cmd.exeではdoskeyでマクロ、Linuxでのaliasのようなものを定義できます。 C:> doskey ls=echo * Linuxじゃないよ! 必要なマクロを一通り設定した後、いったんテキストファイルに書き出しておき、cmd.exe起動時にそのファイルを読み込ませることで常に有効となるようにします。 C:>…(Continue Reading)

CLIツールにPythonスクリプトを渡して、柔軟にカスタマイズできるようにしたい

投稿者: Anonymous 環境 Python 3.6 背景 PythonでCLIツールを作成しています。 あるWebサービスから情報を取得して、以下のようなフォーマットでCSVファイルを出力するようなCLIです。 実際には20~40列あります。 name,a_seconds,b_seconds Alice,3600,1800 Bob,3600,3600 コマンドは以下のように実行します。 $ python print_csv.py やりたいこと CSVのいくつかの列は、ユーザがカスタマイズして出力できるようにしたいです。 たとえば、a_b_hours列を出力したい場合、以下のような設定をコマンドの外から渡せるようにしたいです。 column_name = “a_b_hours” def column_func(df): df[column_name] = df[“a_secons”] + df[“b_seconds”] 出力結果 name,a_seconds,b_seconds,a_b_hours Alice,3600,1800,1.5 Bob,3600,3600,2 質問 上記の機能を提供するために、コマンドの外から、Pythonスクリプトを渡すにはどうすればよいでしょうか? 以下のようなコマンドを実行できるようにしたいです。 $ python main.py 3 num = 3 $ python main.py 3 –script custom.py num * num = 9 main.py…(Continue Reading)

ruby のオプション –debug を使うと Exception が発生する

投稿者: Anonymous CentOS 6.4 にて rbenv 0.4.0-74-g95a039a を使っています。 ruby コマンドのオプション、–debug を使うと Exceptionメッセージが表示されるので、回避方法があればご教示願います。 $ ruby -d -e ‘p $DEBUG’ Exception `LoadError’ at /home/foo/.rbenv/versions/2.1.1/lib/ruby/2.1.0/rubygems.rb:1194 – cannot load such file — rubygems/defaults/operating_system Exception `LoadError’ at /home/foo/.rbenv/versions/2.1.1/lib/ruby/2.1.0/rubygems.rb:1203 – cannot load such file — rubygems/defaults/ruby true 尚、1.9.3 の環境も同様で、1.8 だと期待する結果になりました。 $ rbenv local 1.8.7 $ ruby -d -e ‘p $DEBUG’ true…(Continue Reading)

Windowsでコマンドのエイリアスを作りたい

投稿者: Anonymous Linuxで alias bs=”browser-sync start –server –files *.html,*.css,*.js” として bs をショートカットコマンドとして使っていましたが、Windowsのコマンドラインで同じようにするにはどうしたら良いのでしょうか? 解決 doskeyコマンドじゃダメですか? doskey bs=browser-sync start –server –files *.html,*.css,*.js って感じで行けると思います。 あとは、pathの通ったところにbatファイル作って、batの中に処理を書くとか。 ただ、doskeyだとコマンドプロンプトを開く度に設定してやらんといかんので、コマンドプロンプトのショートカットに起動オプション/k doskey /macrofie=c:wkalias.txtとかって付けてあげて、alias.txtに設定したいaliasを羅列しといてやる必要があります。 当然、ショートカットにオプションを指定していないとaliasが有効になりません。 なので、個人的にはpath通ったところにbatファイル色々作って置くという方法を選んでいます。 回答者: Anonymous

Jenkinsのシェルからnode ●●.js を実行するとcommand not found になる

投稿者: Anonymous ホームフォルダにNodeJsというフォルダがあり、 Jenkins上のシェルからその中にNodejsをインストールする事はできました。 そしてNodeJsフォルダの中にLocalServer.jsというjsファイルがあり、 Jenkins上のシェルから node LocalServer.js とコマンドを実行したところ node: command not found というエラーが表示されました。 vncでJenkinsの起動しているサーバーに接続して、 ターミナルから同様の事を行うと成功します。 原因を探りたいのですが、全く同じフォルダで全く同じ動作をしているので 何から調べていいかわからずヒントでも良いのでご意見をいただけないでしょうか? MacOSX:10.10.4 解決 Jenkins の場合に、node のある場所に PATH が通っていないのでしょう。 node を full path で書くと Jenkins からでも動きませんか? 回答者: Anonymous

C#のコマンドプロンプトで外部出力せずにinput情報を除いた結果を取得するには?

投稿者: Anonymous 以下に示したコードは.mp4ファイルの秒数を一括取得するコマンドです。 外部出力した場合は秒数のみ出力されます。 できれば外部出力せずそのまま出力を受取たいのですが、 秒数以外の情報(ファイルのinput情報)も取得されてしまいます。 外部出力と同じように秒数のみ取得するなら どのような処理になるのでしょうか? string コマンド=”for /F %a in (‘dir /b *.mp4’) do (ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 %a >> mp4sec.txt)” System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = System.Environment.GetEnvironmentVariable(“ComSpec”); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardInput = false; p.StartInfo.CreateNoWindow = true p.StartInfo.Arguments = “/c ” + コマンド ; p.Start();…(Continue Reading)

XAMPP環境で、MySQLに接続しようとしたところ、MariaDBに接続された

投稿者: Anonymous $ /Applications/XAMPP/xamppfiles/bin/mysql -u root -p を打つと、 Enter password: Welcome to the MariaDB monitor. Commands end with ; or g. Your MariaDB connection id is 5 Server version: 10.1.34-MariaDB Source distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the current input…(Continue Reading)

特定のディレクトリの中身を、そのディレクトリから相対で tar を作るには?

投稿者: Anonymous tar コマンドで特定のディレクトリに対して .tar.gz の中身を解凍する時には、次のように実行します。 $ tar xvzf hoge.tar.gz -C ./hoge/ この逆の操作を今実行しようとして、次のように実行しようとしたらエラーになりました。 $ tar cvzf hoge.tar.gz -C ./hoge/ tar: Cowardly refusing to create an empty archive Try ‘tar –help’ or ‘tar –usage’ for more information. 特定のディレクトリの中身に対して、そのディレクトリの中から相対パスで、 tar.gz を作成する方法などありますか? 解決 -C は処理を行う前に指定したディレクトリに移動(change directory)するので、 tar cvzf hoge.tar.gz -C ./hoge/ . とすれば良かったです。 回答者: Anonymous

Linuxコマンドの出力をファイルに行いたい

投稿者: Anonymous 以下のコマンドを実行すると、指定したディレクトリ下に存在する全てのファイルのサイズを標準出力できます。 find . | xargs wc -c ファイルに出力しようと思い、実行したのは以下のコマンドです。 find . | xargs wc -c > file.txt 実行した際のエラーは以下です。 wc: .: Is a directory 解決 wc コマンドは ファイル の情報を取得するコマンドです。 find . で実行すると、ファイルと ディレクトリ の一覧が表示されます。 今回の場合であれば、以下の様に find で ファイルのみ を検索するようオプション指定するのが一つの方法かと思います。 find . -type f | xargs wc -c > file.txt 回答者: Anonymous

Linux で疎通確認のためポートに応答するサーバーをたてるコマンド

投稿者: Anonymous AWS EC2 上でサーバープログラムをたてる前の何もない状態で セキュリティグループの設定があってるかネットワークの疎通確認がしたいです クライアント側は telnet なり curl なりを使えばいいと思うのですが サーバー側でポート番号を指定して bind して listen して echo なり簡易的な応答をしてくれるようなコマンドやプログラムはないでしょうか TCP のコネクションハンドシェイクが確認できればいいので receive や response すらなくてよくて bind と listen だけして 接続が来たら標準出力になんかはいてくれればいいんですが 自分でかくしかないでしょうか 解決 簡易 TCP サーバーとして使える nc コマンドで待ち受けておくのはいかがでしょうか。 nc -l 〈ポート番号〉 改造例: nc コマンドで簡易HTTPサーバ あるいは Python のワンライナーで HTTP サーバーを立ててしまうのも OK そうです。 # Python 3 python -m http.server…(Continue Reading)

コマンドラインのショートオプションの大文字小文字の使い分け

投稿者: Anonymous 背景 PythonでCLIツールを作成しています。 コマンドライン引数のパースは、argparseモジュールで行っています。 考えていること ロングオプションからショートオプション名を考えています。 質問 ショートオプションで大文字/小文字は、どう使い分ければよいですか? Command-Line Options – The Art of Unix Programmingに載っているショートオプションには、-dも-Dもありました。 上記サイトには、ショートオプションに関して、次のように述べています。 大文字よりは小文字がよい 大文字は、小文字オプションの特別な変形として使うのがよい In this style, lowercase options are preferred to uppercase. When you use uppercase options, it’s good form for them to be special variants of the lowercase option. 「特別な変形」とは具体的に、どのようなことを指しているのでしょうか? 参考にしたサイト Are there standards for Linux command…(Continue Reading)

ターミナルの出力結果に対して文字列検索を行うには

投稿者: Anonymous ターミナルでコマンドを実行した際に出力される結果に対して、文字列検索をして結果を絞りたい場合はどうしたら良いでしょうか? 現在はVScodeに出力結果を貼り付けて検索しています。 defaults domainsと実行すると文字列がたくさん出てくるのでgoogleの文字列を含む値のみ抽出したいです。 例:出力結果 Apple, google, MS, daison, cola, google… 期待する結果 google, google 解決 | (パイプ) で出力結果をリダイレクトして grep コマンドを使うのがオーソドックスな方法の一つかと思います。 $ COMMAND | grep ‘pattern’ "pattern" の部分には正規表現を利用できます。パターンを含む 行 を出力するので、オプションを使えばパターンに一致した箇所に色付けしたりすることもできます。 $ COMMAND | grep –color ‘pattern’ 回答者: Anonymous