bashメモ

よくわからなくなる部分をメモっとく。

rsync

フォルダの同期に使う。たまにしか使わないし、履歴一発でキメてしまうためよく忘れる。

# 基本的な使い方(-aでアーカイブモード、-rpltgoDと同じ)
# -r:再帰的に同期
# -p:パーミッション情報保持
# -l:シンボリックリンクを同期先で再作成
# -t:タイムスタンプを保持
# -g:グループ情報を保持
# -o:オーナ情報を保持
# -D:同期先でデバイスを再作成(rootのみ可能)
$ rsync -a 同期元ディレクトリ 同期先ディレクトリ

# 進捗を表示する
$ rsync -a --progress 同期元 同期先

# 情報強化(vは最大3つまで付けられる)
$ rsync -avvv --progress 同期元 同期先

cut

cutはテキスト・ファイルの各行から指定した部分を取り出すコマンド。指定する部分には、バイト(-bオプション)、文字(-cオプション)、フィールド(-fオプション)が使える。

  • 例:1文字目から10文字目といった範囲指定は「-c 1-10」
  • 例:4文字目以降すべてを取り出す場合には「-c 4-」
一般に各行の文字数は固定では終わりの文字位置は指定しない(長さがわかんないから)。 デリミタは-d''で指定。\rとかはダメみたい。

tr

文字の置換(TRanslate)。改行削除とかに使ったりする。 例:abcを削除

 $ cat sample.txt | tr -d abc

find

"find 「検索ディレクトリ」「検索条件」「コマンド」"が基本。 カレントディレクトリの中から*.cを探す例は以下。

 $ find . -name "*.c"

ここを参考にしよう。ちゃんとまとまってるし。

ヒストリ活用

bashのコマンド履歴を最大限使うためのコマンドたち。

 #最後のコマンドをもう1度
 $ !!

 #n個前のコマンド実行
 $ !-n 

 #直近で使用した(command)から始まる履歴を再実行
 $ !(command) 

 #直近で使用した(command)から始まる履歴の2番目の引数を抜き出す
 $ !(command):2 

 #直近で使用した(string)を含む履歴の再実行。末尾の?は必ずしも必要ではない。
 $ !?(string)?  

 #直近で使用したコマンドの(string1)を(string2)に置換して実行
 $ ^(string1)^(string2) 

 #直近で使用したコマンドに含まれるパス名の、一番最後をちぎる
 $ !!:h 

 #直近で使用したコマンドに含まれる拡張子をちぎる
 $ !!:r 

 #直近で使用したコマンドに含まれるパス名の一番最後だけを残す
 $ !!:t 

 #直近で使用したコマンドを表示
 $ !!:p 

 #直近で使用したコマンドをシングルクオートで囲む
 $ !!:q 

 #直近で使用したコマンドの文字を置換
 $ !!:s/(string1)/(string2)/ 

以下使用例。

 # !!:h:直近で使用したコマンドに含まれるパス名の、一番最後をちぎる
 $ ls -lshrt /home/bisco/workspace
 $ !!:h     # ls -lshrt /home/bisco
 $ !!:h     # ls -lshrt /home
 
 # !!:r:直近で使用したコマンドに含まれる拡張子をちぎる
 $ ls -lshrt hello.txt
 $ !!:r     # ls -lshrt hello

変数のマッチング(2つつくと最長、1つだと最短マッチ)

#は先頭から調べて、%は最後尾から調べる。

 ${path##/*/}                         long.file.name
 ${path#/*/}                 can/book/long.file.name
 $path                 /home/can/book/long.file.name
 ${path%.}             /home/can/book/long.file
 ${path%%.*}           /home/can/book/long
 
 $var                      biscobiscobiscobisco
 ${var//bisco/hello}       hellohellohellohello
 ${var/bisco/hello}        hellobiscobiscobisco
 ${var/#bisco/hello}       hellobiscobiscobisco
 ${var/%bisco/hello}       biscobiscobiscohello

[脇道]改行コードの変換

わりと頻繁に忘れるからちゃんとメモ。改行コードはWin(Dos)とLinuxそれぞれ以下がデフォルト。 perl -pe ''」が便利なのでちゃんと覚えておこう。

 # Dos→Lin
 $ cat text.txt | tr -d \\r           > result.txt
 $ cat text.txt | sed -e 's/\r$//g'   > result.txt
 $ cat text.txt | perl -pe 's/\r//g'  > result.txt
 
 # Lin→Dos
 $ cat text.txt | awk '{sub(/$/,"\r"); print}' > result.txt
 $ cat text.txt | sed -e 's/$/\r/g'            > result.txt
 $ cat text.txt | perl -pe 's/\n/\r\n/g'       > result.txt

[脇道]文字コードの変換 without nkf

nkfなくてもrubyがあれば生きていける。 ここから引用しました。

# text.txtをutf-8に変換
$ cat text.txt | ruby -r nkf -pe '$_ = NKF.nkf "-w",$_'