findコマンドで検索する階層を指定(maxdepth)

findコマンドで、そんな深い階層まで調べなくていいよって時に使う。

自分はカレントディレクトリのみでいい時に使うことが多そう。

  • カレントディレクトリのみでファイル名がgzで終わるやつ

    -maxdepth n で階層を指定してあげればよい。1ならカレントディレクトリのみ

スクリプトで配下のディレクトリにファイルをmvして、移動したファイルが次回のスクリプトで対象になってほしくない時なんかに使うと思う。

bashのtab補完でシンボリックリンクでも後ろにスラッシュを付ける

DISK何台かあって、HOMEディレクトリ下の特定のディレクトリをシンボリックリンクで別ディスクにリンクなんかしてると

bashのtab補完で、後ろにスラッシュを追加してくれなくて困ったりする。tabをもう1回押せばスラッシュも補完してくれるけど。

結論以下。

何故かbashrcじゃなくてこっちのファイルなのだが詳細とかは調べてません。readlineだから?

disownしたプロセスの標準出力や標準エラーを後から保存する

前の記事で、disownの素晴らしさを紹介したが、基本的に標準出力・標準エラーを諦めることになる。

調子の悪いHDDの丸ごとコピーとかだと、標準エラーを後で見たいので、なんとかならないかネット検索したところ、

gdbで接続して、dup2で標準出力・標準エラーをファイルに繋ぐなんて荒業を紹介している人がいた。

dup2なんてCプログラマじゃなきゃ使おうとも思わんな。

流れとしては、

 

  • 特定のコマンドをdisownする。前の記事参照。
  • プロセスIDを調べる
  • 標準出力、標準エラーのファイルを用意する
  • gdb -p で接続する
  • dup2でファイルに接続する。
  • デタッチ
  • gdbを抜ける

 

うーん。絶対忘れる。

 

以下、サンプル。実際はcpとかでやると思うが今回は、標準出力と標準エラーが分かりやすいようにしている。

標準出力にはdateの結果、標準エラーにはerrorを5秒間隔で。

うーん。非常にメンドイ。なるべくnohupを使いましょう。それか日常的にscreenを使いましょうってことですね。

ただ、考え方は非常に面白いので、覚えておくのはいいと思う。

実行中のコマンドをバックグラウンドにしてログアウトしても消えないように(disown)

軽い気持ちで実行したコマンドが、なかなか終わらなくて、あー。もー。帰りたいのに終わるまで帰れない。

なんて経験があったりする。ただこの disown ってコマンドを覚えておけば、そんなことを気にしないで実行したまま家に帰ることが出来る。

たぶんbash限定かもしれないけど、自分bashしか使わないので。。。

具体的には、

Ctrl-z でプロセスを一旦止めて、

bg でバックグラウンドプロセスにして。

って感じ。

ただこのままログアウトしても大丈夫なプロセスもあったりするのだが、止まるやつは止まる。

そこで、 disown %1 を実行してあげる。(%1はjob id jobsコマンドで確認出来る)

これでログアウトしても止まらないはずなので、安心して帰れる。

 

以下サンプル(cpの大量コピーとかがよくあるかと)

こんな感じ。標準出力するプログラムだと、入力が大変だが、めげずに実行する。

ログアウトすると、標準出力、標準エラーは保存できないので、そこは諦めるか別の方法

最初から、時間がかかるのがわかっているなら、 nohup を使ったほうが良い。標準出力もファイルに保存されるので。

nohupの記事も過去にちょろっと書いた。

 

標準入力からdiff

diffでファイルの比較とかやってると、実行するコマンドの結果(標準出力)を元に比較出来ないのかなと悩むことがある。

一度ファイルに落としてからdiffすればいいので、特に調べてなかったが、ちょいと調べたらあっさり見つかった。

コマンドの標準出力を比較する場合。

 

 

うわ。めっちゃ簡単。bashだけらしいけど、bash以外使った事ないから充分。

<(の間にはスペースは入れてはだめ。

 

コマンドの標準出力とファイルを比較する場合。

diffに限らず

こいつは、いろんなところで使えそう。

無知は罪ですな。

 

 

コンフィグのバックアップは、シェルのブレース展開を使うと便利

なかなか便利だけど忘れてしまうブレース展開

この記事でもちょっと触れたが、今回は違う使い方。

Linuxのサーバを管理していると、コンフィグを変更する前に、バックアップファイルを作ったりすると思う。

例)

 

これもブレース展開でやれば、タイプ量も少なくて経済的

例)

 

うーん。便利。

findでブロックファイルやキャラクタファイルを探す

めったに無いのだが、ファイルシステムがクラッシュした時の影響か、普通のファイルがブロックファイルやキャラクタファイルになっている時がある。そいつを検索する方法。

typeオプションで、b ならブロックファイル、c ならキャラクタファイル。

 

 

lsしたかったら

 

消したかったら、、、略

forとかwhileループでnohup

普段Linuxをメインで使っていると、bashで、forとかwhileループをバシバシ使って処理することがあると思う。
直ぐ終わる処理だと、特に気にしないのだが、大量のデカイファイルをコピーするなど
時間のかかる処理だと、バックグラウンドで実行したい時があるが、普通にnohup使うと
エラーになって使えない。

  • バックグラウド実行したいループ処理

 

 

 

単純に頭にnohupを付けて行末に&だと上手くいかず
以下のようにしたら上手く言った。

 

 

 

  • bachの-cオプションに処理したい内容をシングルクォート(‘)で渡す
  • 変数はダブルクォート(“)で囲む

と言った感じ

【続】シェルスクリプトで、アルファベット一覧を使いたい時

前にシェルスクリプトでアルファベット一覧を出力する方法を書いたが、今日もっと驚異的に簡単な方法を知ってしまった。

ブレース展開というらしい。

これだけ。前回のは何だったのかと悲しくなるくらい簡単だった。

このブレース展開、(,)カンマ区切りだと見たことある気がするけど、(.)ピリオド2つで範囲指定出来るとは驚き。

しかも隣接する文字がある場合は、そっちも展開してくれるのでIPアドレスの範囲指定なんかでも超便利。

うーん。無知って罪ですね。

bashのeオプションを一時的に無視する

シェルスクリプトを書いていると、エラー処理を書くのが面倒で、とりあえずbashをeオプションで起動しておけばいいや程度に思っていたりします。シェルスクリプト中のどこかでエラーが出ればスクリプト自体を終了してくれるので何かと便利なんですが、途中無視できる程度のエラー処理で止まって困ることもあるので、そこを何とか無視する方法を調べました。まーmanに書いてあったんでちょっと読めば気付くんでしょうが自分は結構時間かかりました。

-e      単純なコマンド (前述の シェルの文法セクションを参照) が 0 でないステータスで終了した場合、即座に終了します。ただし 失敗したコマンドが until または while ループの一部である、 if 文の一部である、 && または ││ リストの一部である、コマンドの返り値が !  で反転されている、のいずれかの場合にはシェルは終了しません。

上の条件に当てはめてしまえばいいだけです。

サンプルとして、以下のようなスクリプト。

 

最初のfalseでは、止まらず次のfalseで止まって、最後のechoは処理されないはずです。