それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bash

コマンドが存在するか調査するコマンド、その名もcommand

コマンド存在スルか調査するコマンドに command が使えます。 $ command -v ls ; echo $? alias ls='ls --color=auto' 0 シェルの実行結果は 1/0 で戻されています。 echo $? は直前のシェルの実行結果$? を出力しています。正常終了なら0 異常終了なら $? >…

シェル ( /bin/sh ) での正規表現マッチ。

以前、bash の正規表現について書いた。 今回は、今更だけど、あえて、bash/zsh で使われている [[ を使わずに、正規表現を使おうとしてみた。 expr よりは bash の機能を使ったほうがいい。 以前書いた記事にある。bash/zsh の正規表現を使う方法が個人的に…

空白を含むパス名を含むコマンド文字列をシェル(bash)で処理する

" program files " のような空白を含むパス名を持ったコマンド全体を、変数に保持しててそれを実行したい時 そのままだと動かない。 ## これが実行できない。 cmd='ls ~/Library/Application\ Support/' $cmd 空白を含むパス名を入れたコマンドを文字列とし…

ディレクトリの中のファイルを「時刻」でソートする find と lsをつかって、最新のファイルだけを取り出す。

ls コマンドの場合 ls -t | head -n1 ls コマンドで、時刻順に並べることができるので、これを head と組み合わせれば出来る。 takuya@Gitlab:~$ sudo ls -lt /var/opt/gitlab/backups/ total 92268132 -rw------- 1 git git 43629199360 Apr 25 02:20 15877…

指定したファイルが存在するフォルダを指定する

画像が入ったフォルダを取り出したい。 Nextcloud を触っていて、画像が散らばってしまった。なので、画像大量に入ったフォルダを調べることにする。 となると、どんな方法が良いか思案したが、一番手っ取り早いのは find コマンドだろう find コマンドでjpg…

findコマンドでファイルの所有ユーザーを調べ所有者を間違っているファイルを探す。

find コマンドで、自分以外の所有者のファイルを探す。 ユーザーがtakuya 以外のファイルやディレクトリを探す。 find . -not -user takuya 指定した所有者のファイルを探す。 not を外せば、所有者を限定してファイルを探す。 find . -user takuya オーナー…

指定サイズのファイルを作る方法 ( head 編 )

任意の指定サイズのファイルを作る方法 head を使う場合。 takuya@~$ head -c 100k /dev/urandom > out takuya@~$ ll out -rw-r--r-- 1 takuya staff 100K 2020-03-18 13:59 out ランダム( /dev/urandom) から読み出して、指定サイズを作ります。 head は -c…

GLOBIGNORE で一時的に*(ワイルドカード)のglob 展開を止める。

bash / sh を使ってると glob が邪魔な時がある。 シェルスクリプトを書いていると、 * のワイルドカードの展開がじゃまになるときが多々あります。 その都度エスケープ刷ることが多いと思います。 たとえばワイルドカードを受け取ってあとで展開するような…

find コマンドで シンボリックリンク以外を表示してduする

シンボリックリンクを隠して一覧を取得したい。 実ファイルの du を取ろうとしたときに、シンボリックリンクがじゃまになる。 find -not -type l du を組み合わせて戦う。 du したいときなら ディレクトリと階層を指定する find -type d -not -type l -maxde…

bash で指定回数ループする方法いろいろ for / while など

bash で指定回数ループする方法のあれこれまとめ bash で使える方法です。sh では使えません。 while で10回ループ bash 算術演算のカッコと組み合わせて強いです。 #!/usr/bin/env bash while (( cnt++ < 10 )); do echo $cnt done break も使えます。 br…

シェル(bash)の履歴を指定業だけど消す(間違えてパスワードを履歴に残した)

パスワードを打ち込んでエンターしてしてしまった。 パスワードなど、履歴を残したくない文字列を履歴に残してしまった場合。 たまに、やらかしますよね。複数ウインドウでフォーカスが違ってたとか。 takuya@:~$ 'MyP@$$word' -bash: MyP@$$word: コマンド…

シェルスクリプトで実行中の関数名を関数内部から知る(自分自身の関数名)

自分自身の関数の名前を知りたい。 関数名は、関数名を表す変数に入っている(BASHで確認) echo ${FUNCNAME[0]} これを使うと、自分自身の関数名を実行中に参照できる。 takuya@Desktop$ function sample() { echo ${FUNCNAME[0]} ; }; sample sample 便利…

空白区切り文字列 を xargs で行へ展開-1行→複数行

xargs があるとすぐ出来ます。 xargs -n1 echo 例 空白区切りされた文字列をぱぱっと複数行にする。 xargs と echo を組み合わせると楽。 takuya@~$ echo hello world hello world hello world hello world | xargs -n1 echo hello world hello world hello …

ファイルが作成されてから何秒経っているか?作成後指定秒経過したらなにかする。

ファイルが作成されてから何秒経っているか? このファイルが、作成されてから何秒経過したか。それ知りたいことありませんか? ファイルAがファイルBより古いときはファイルAを更新するとか 作成後(更新後)の経過秒数を知る echo $(( $(date +%s) - $(date…

which コマンドでPATHにある同名のコマンドを全部列挙する

PATH の優先順位に悩まされるたときに which which コマンドを使うと 環境変数 PATH にあるコマンドのうち、最初に見つかったもの(実行されるもの)を表示してくれます。 which python どのコマンドが実行されるのか調べるのに便利ですし、よく使ってると思…

bash で三項演算子っぽく処理を書くには

bash でも三項演算子を使いたい かんたんな、初期値nullチェックとかで三項演算子的なことをよくやります。 bash でもやりたいなと思って調べててみたけど、なかった(あったので追記書きます。)。 条件分岐を使って原始的な手法がsh/bash で使えるのでご紹…

すぐわかる標準エラー出力と標準出力の捨て方( /dev/null へリダイレクト

だれですか ' &1' なんてファイルを作ったのは。 サーバーにログインしてみてたら'1' っていうファイルがあるんですね。1という名前のファイルがあるんですよ。 どう考えても、リダイレクトに失敗してますよね。 標準エラー出力を捨てる速攻で覚えるの書き…

bashのループと数字比較を組み合わせでVPNを接続開始して接続待ち、接続後に処理をする。

bash のサンプルプログラムを考えてた。 よくあるパターンとして、 〇〇を実行して〇〇が△△になるのをまってから、□□する を考えてみた。 VPN の接続を待機する 今回のサンプルはMacでVPNを接続し、接続待ちをし、VPN接続が完了したらルーティングを加える。…

bash の* ( アスタリスクのワイルドカード)でドットファイル(隠しファイル)を一時的にマッチさせる

TL;DR shopt -s dotglob shopt -u dotglob ドットファイルも含めたい時がある。 for i in $ (ls -a) はめんどくさいんだよなぁ ホームディレクトリで、*でワイルドカードマッチさせても一致しないのが不便。 ls -al しているときは気にならないのだけど、一…

$(pyenv init -) が遅いので遅延ロードにした

ターミナルの起動が遅い。 最近、妙にターミナルの起動が遅くて苦痛だなと思って調べたら pyenv 関連だった。 rbenv もそうだったし、pyenv もやはり遅い。 rbenv に関してはrbenv init では諦めて、symlink を使って解決しているが pyenv は別の方法を模索…

bash で mac かどうかを判定する

mac かどうかをbash のif文の条件判定する [[ $(uname) =~ Darwin ]]; echo $? ## または [[ $(uname -a ) =~ Mac ]]; echo $? bash の正規表現ってホント便利 正規表現を使わない場合 bash 以外と bash 3.2 未満は正規表現が使えないので、glob でマッチす…

xargs でシェルのalias を使えるようにする方法。

xargs で alias が使えない takuya@:教科書$ find -type d -maxdepth 1 | xargs ll xargs: ll: そのようなファイルやディレクトリはありません 悲しい。Aliasはあくまで bashのエイリアスであり、シェル経由せずにfork するような場合には全く役に立たない。…

sudo su実行後も環境変数を維持する

suの実行後にカレントディレクトリを維持したい su を実行するとカレントディレクトリが変わってしまうので、いまいるディレクトリやeditor 変数をそのままに 別ユーザーになりたい。 sudo -E を使う sudo にオプションを付ければ、カレントディレクトリなど…

xargsで複数行のコマンドを実行する方法

xargs で複数行のコマンドを実行したい。 出来ない・・・ ls *.txt | xargs -I@ echo @ ; sleep 1 forループならできるんだけど、for ループだとどうしても不便。 xargs でシェルコマンドを作って渡す. xargs だと限界があるので、もうシェルの文字列にして…

画像をpdfに変換する

画像を、PDF(画像埋込)に変換する img2pdf を使ってみる img2pdf のインストール img2pdfは pip で提供されている pythonのコマンドなので pip でインストールする。 pip install img2pdf これで準備出来た。 使ってみる。 ls *.jpg | xargs -I@ img2pdf @…

xargs で実行前に確認のY/Nを実行する interactive

xargs のコマンド実行前に確認する xargs -p これで、毎回確認できる 使ってみた例 takuya@temp$ ls *.jpg | xargs -p -I@ --verbose mogrify -crop 2886x3700+0+0 @ mogrify -crop 2886x3700+0+0 out-000.jpg ?...y mogrify -crop 2886x3700+0+0 out-000.jp…

xargs 実行するコマンドを確認表示してどこまで進んだかを見やすくする

xargs 便利ですよね。 コマンドを明示的に1つずつ実行したり、ファイルをまとめて実行したり。実行する子プロセス数(スレッド)を指定できたり。 まとめて処理しているときにどこまで処理しているかを見ながらやってほしい たとえば、rsync の場合だと rsy…

dateコマンドで unix epoch time の int 秒を取得する

date +"%s" bash を使ってて、今の時間を int 表記でタイムスタンプとしてほしいよねってとき。 takuya@~$ date +"%s" 1538853051 こうすれば、Unix秒、つまり1970 からの経過秒数が取得できる。 知っておくと便利だし。Gnu Date の時刻フォーマットなので、…

sudo で シェルのaliasされたコマンドを使えるようにするけど、環境変数を渡さない。

sudo するとコマンドnot found あああ、、もう。 takuya@sakura:~$ sudo ll sudo: ll: command not found alias に頼り切ってると、こういうことが頻繁に起きる 解決策 alias sudo='sudo ' コレが解決策 間違った解決策: preserve Environment sudo -E 環境…

コマンドで重複ファイルを探す。

重複ファイルを探すコマンド find . -type f -exec md5sum {} + | sort | uniq -w32 -dD find して md5sum にかけて sort したら、uniq を取る 解説 コマンドがズラッと並ぶのでひとつずつ見ていく 現在のディレクトリ以下のエントリ(Dir/File)を列挙 find .…