【俺用メモ】Linuxのコマンドラインでよく使いそうなの


いろいろ覚えてると便利なんですけど、使わないコマンドって忘れちゃいますよね。
なのでメモしておきます。

余談ですけど、Qiitaでコマンドラインのシンタックスハイライトって何の言語を選ぶのがいいんですかね。文字列の色を変えてくれるcを適当に選んじゃいましたけど。

findコマンドのメモ

-d オプション

-d     A synonym for -depth, for compatibility with FreeBSD, NetBSD, MacOS X and OpenBSD.

階層の深さを指定できるので深掘りしすぎてfindコマンド終わらない みたいなことがなくなるので幸せになれますね。

指定の文字列を含むファイル検索

find ./ -type f -name "*.rb" -print | xargs grep "hoge"

Rubyファイルでhogeという文字列を含むファイルを表示するコマンド。
aliasでgrepまでを登録しておいてfgr hogeみたいな使い方してます。
これはよく使うし、これで事足りるので覚えてますが、発展形は忘れることがあります。

これをベースにした発展形が以下の通り。

ファイル名に特定の文字列を含むファイルは除く

find ./ -type f -name "*.rb" ! -name "include.rb" -print

コメントで教えていただいたコマンドを記載します。
man findを読んだところ演算子が用意されてました。

! expression
-not expression
This is the unary NOT operator

他にも-andや-orもあったので上手く組み合わせると、より柔軟な検索ができそうです。

find ./ -type f -name "*.rb" -print | xargs grep hoge | grep -v "exclude_filename"

こちらは元々私が記述したもの。
grepの-vオプションで特定の文字列を除外します。
grepした結果に対してやってるのでファイル名と同じ行にしか適用できませんけど。
swpファイルを除きたいとか拡張子を指定しないでgrepしたあとで.phpだけ除外するとか、そんな使い方でしょうか。
たまに使いますし、-v程度なら忘れません。

ファイル名だけ表示

find ./ -type f -name "*.rb" -print | xargs grep -l "hoge"

コメントで教えていただいたコマンドを記載します。
man grepをしたところ-lオプションというのが用意されてました。

-l, --files-with-matches
Only the names of files containing selected lines are written to standard output.

マッチしたファイル名だけを表示する、ということができます。
なので下記のようにわざわざcut & uniqなんてする必要ありません!

find ./ -type f -name "*.rb" -print | xargs grep "hoge" | cut -d':' -f1 | uniq

基本形(grepで特にオプションを指定しない場合)の実行結果は
「ファイルパス:該当行」
といった感じになります。
プログラムでインデントが深かったり、あるいはfind対象がcsvとかtsvの場合は結果がえらいことになります。
ので、cutコマンドでファイルパスと該当行を分割して1列目だけを表示するようにしてます。
また1ファイルで何回もその文字列が出てくる場合も往々にしてありますのでuniqで一意にしてます。が、前述の-lオプションがあれば不要です。

ディスクの空き容量がなさそうなとき

使用量確認

df -h

どのディレクトリが容量食ってるか確認

du -hs /*

以降ディレクトリを掘っていって特定する運用。
上記の例だとルートディレクトリ以下に対してやってるので時間かかるし、rootとかじゃないとパーミッションで怒られるので適宜ディレクトリを変える。
*つけない場合はそのディレクトリの総計のバイト数が表示されて、どこがいくら使ってるとかは見れない。

-hオプションについて

print sizes in human readable format (e.g., 1K 234M 2G)

人間の読みやすい形にしてくれる

-sオプションについて

display only a total for each argument

サマリ(翻訳諦めた)

コメントで教えていただいたこと

@tukiyo3さんに教えていただきました。
元記事を削除したためこちらで紹介、御礼を申し上げます。

パーミッションで怒られるのを回避(エラーメッセージを表示していないだけで、集計はできていない)
du -sh /* 2>/dev/null
ギガのものだけ抽出
du -sh /* 2>/dev/null | grep G
容量の大きい物順に表示
du -sh /* 2>/dev/null | grep "G¥t" | sort -nr