- grep:ファイルに特定の文字列が存在するかを検索するときに使われるコマンド
ソースファイルの中に特定の変数が含まれているか調べたい時にファイルを開かずgrepコマンドでファイル名のみ指定で文字列の検索が可能。使い方は以下の通り。
$ grep 検索文字列 ファイル名。ex) grep include calib.cpp ←これでcalib.cppの中で"include"を含む文字列を表示してくれる。
また、"パイプ"と呼ばれるコマンドとコマンドをつなげる機能を持つ「|」を用いて、lessコマンドと一緒に使うことも可。
ex)"include"を含む行を抽出↓
$ grep include calib.cpp | less
他の詳しい使い方は、ここを参照してください。
- scp:サーバとファイルやディレクトリのアップロード/ダウンロードのやり取りができるコマンド
- ファイルのアップロード(ディレクトリを全てアップロードする時は、オプションとしてscpの後に"-r"をつける。)
scp アップロードしたいファイルまでのパス(またはディレクトリまでのパス) サーバのユーザーID@サーバのドメイン名:アップロード先のディレクトリまでのパス
ex) $ scp ~/Desktop/image.jpg sample@hogehoge.jp:~/Desktop/ (~はホームディレクトリを指す)
上のコマンドが通れば、サーバのパスワードが聞かれるので入力する。アップロードが成功すると、右側にパーセンテージ、容量などが表示される。
上で書いてるサーバのユーザー名は、ログイン時のユーザー名で、サーバのドメイン名とは、サーバのアドレスである。例としてRCNPのサーバだったら、@rcnp.osaka-u.ac.jpみたいな感じ。
~/は、ホームディレクトリ以前を省略した書き方で、"pwdコマンド"をすれば分かる。
アップロード先のディレクトリを指定した/の下にファイルがアップロードされる。また、ディレクトリをアップロードする時は、指定したディレクトリ以下にディレクトリがあれば、それも一緒にアップロードされる。(当たり前か笑)
- ファイルのダウンロード
scp サーバのユーザーID@サーバのドメイン名:ダウンロードするファイル名 ダウンロード先
ex) $ scp sample@hogehoge.jp:~/Desktop/image.jpg ~/Desktop/
- あるサーバからローカルを介さずに、別のサーバへディレクトリやファイルをコピーする
このページが非常に分かりやすく書かれているが、自分でももう一度書いておく。
例えば、taro@123.456.7.8というサーバの中のホームディレクトリ下にある一つのtest.txtを、taro@123.456.7.9というサーバにコピーしたい場合。
まずは、受け取る側のサーバにsshログインしておく。(ここでは、taro@123.456.7.9)そして、sshログインしたところで、以下のように書く。
scp -p taro@123.456.7.8:~/test.txt ./
taro@123.456.7.8のパスワードが聞かれるので、入力すると、taro@123.456.7.8にあるtest.txtがtaro@123.456.7.9のカレントディレクトリにコピーされる。
また、.txtと名のついたファイルが複数あり全部コピーしたい場合は✴︎(アスタリスク)を用いて次のように書く。
scp -p taro@123.456.7.8:~/*.txt ./
こうすることにより、.txtの拡張子がついたファイルを全部コピーすることができる。
また、ディレクトリ丸ごとコピーしたい場合は、以下のように書く。
scp -pr taro@123.456.7.8:~/test ./
こうすることで、指定したディレクトリ(この場合だとtest/)が再帰的にコピーされる。
- rsync:リモート環境とファイルやディレクトリを「同期(sync)する」
rsyncの書き方→rsync [オプション] [同期元] [同期先]
ディレクトリを同期したい場合→rsync -av 同期元/ 同期先/
ex) 同期元として新しくディレクトリを作って、同期元の中身を同期先のディレクトリの中にそのままコピーできる。
- sftp:sshとscpの二つの機能を持ったコマンドで、別のサーバに入れてそのサーバからファイルを持ってくることができる。
sftpは、ROOTのように対話的に操作を行う。
使い方: sftp [入りたいサーバ名]
→パスワードを聞かれるのでサーバのパスワードを入力。転送したいファイルがあるディレクトリまでcdやlsで移動、 確認。
次にgetコマンド(sftpでの対話的コマンドの一つ)を使う。このコマンドでリモートマシンからローカルマシンへファイルを転送できる。
ex) 欲しいディレクトリを開いて、その中のある一つのファイルをローカル側へ転送したい時、
get [欲しいファイル名]
→これをすると、自分のホームディレクトリにそのファイルが転送される。(同じ要領でputコマンドを使うとローカルにあるファイルをリモート側へ転送できる)
※sftpコマン ド実行中に使える主な対話的コマンド
lcd パス名:ローカルホストの作業ディレクトリを変更できる。
lls:ローカルホストの作業ディレクトリ内のファイルやディレクトリの一覧を表示させる。
lmkdir ディレクトリ名:指定したディレクトリ名をローカルホストのディレクトリ内に作成する。
quit or exit or bye:sftpコマンドの終了
このサイトは比較的分かりやすく書いてあって良いと思う。
- tar:ファイルの圧縮や解凍を行う
ファイルの圧縮はディレクトリごとするならば、"tar zcvf [directory名].tar.gz [directory名]"で、解凍は、tar zxvf [directory名].tar.gzである。
また、sshと組み合わせることでファイルやディレクトリの転送が可能。実行コマンドの例は以下のコマンド。
tar zcf - [送るディレクトリ名] | ssh アカウント名@ドメイン名 'tar zxf -'
ただ、この場合はホームディレクトリにしかコピー出来ない。(他のディレクトリに直接コピーすることも可能なはずなので後日追記)
・ローカルからリモートへ、ローカルでファイルとフォルダを圧縮し、リモートでアーカイブファイルとして保持させる方法
tar zcvf - ~/アーカイブ化したいディレクトリのパス | ssh アカウント名@ドメイン名 "cat > [アーカイブを作成したいパス]/[ディレクトリ名].tar.gz"
- nslookup:ドメイン名を入力することで対応するIPアドレスが分かる
基本的な使い方として、例えばプリンターでプリントしたい時、そのIPアドレスを知りたいことがある。
その時に、nslookup [ドメイン名] とすれば、そのデバイスのIPアドレスを知ることができる。
- cp:ファイルやディレクトリをコピーできる
使い方としては、例えばホームディレクトリ下の/analysisの中にあるtest2.txtをホームディレクトリ下の/dataにコピーしたい場合は以下のように書けば良い。
cp ~/analysis/test2.dat ~/data
と書けば良い。
ここで、ディレクトリをコピーしたい場合は、"-r"を付けなければならない。
また、ディレクトリをコピーしようとして"cp"だけでしようとすると、"cp: omitting directory"というエラーが出る。これはディレクトリのコピーをしようとしてるのに、"-r"をつけてないからである。
- finger:誰がいつログインしたかなどが分かる
例えば、サーバ上で、finger [アカウント名]とすると、そのアカウントがいつログインしたかなどが分かる。
- factor:数字を入力すると、素因数分解してくれる
- chmod:ディレクトリやファイルのパーミッションを設定するコマンド
このページ参照
ex)ファイルを読むことだけを許可するには、chmod 644 test.html のように644とすれば、所有者:-rw-、グループ:r--、その他のユーザー:r--となる。ここで、それぞれにモード(数字)が割り振られており、読み取り(4)、書き込み(2)、実行(1)となっている。
要するに、「764」は、"所有者"は「読み取り、書き込み、実行」、"所有グループ"は「読み込み、書き込み」、"その他"は「読み取り」に対応している。
また、もう一つのやり方としては、変更対象がユーザー、グループ、その他、全てはそれぞれu、g、o、aで表され、変更方法は、3通り(=、+、-)あり、それぞれ指定した権限にする、指定した権限を付与する、指定した権限を除去するとなっていて、変更内容も3通り(r、w、x)あり、それぞれ読み取り、書き込み、実行となっている。例を下にあげる。
chmod u+x hoge.txt
これは、uが変更対象、+が変更方法、xが変更内容となっていて、ユーザーに実行権限が与えられたことになる。また以下のように複数指定することもできる。
chmod go+w hoge.txt
この場合は、グループとその他の人に、書き込みの権限が与えられたことになる。
- chown:ファイルの所有者、グループを変更することができる
このコマンドは、ファイルやディレクトリの所有者を変更できたり、所有グループも変更出来たりする。
ファイルやディレクトリの所有者を変更は、スーパーユーザーのみ。一般ユーザーは、自ら作成したものでも変更出来ない。所有グループの変更は、自らが所属してるグループであれば変更可能。以下に例を示す。
$ ls -l
-rw-r--r-- ichiro ichiro test.txt
だったのを、chown jiro test.txtとすることで、ls -lをすると、-rw-r--r-- jiro ichiro test.txtのようにjiroに所有者が変更される。
次に、ファイルの所有者をichiro、所有グループをfireに変更するときは、以下のようにする。
chown ichiro:fire test.txt
これにより、ls -lをすると、-rw-r--r-- ichiro fire test.txtのように変わる。
また、全てのファイルの所有者をtaroからfireにしたい場合、いちいち一つずつやるのでもいいがめんどくさい。これを一気に変更できるやり方があり、次のようにするとできる。
chown taro:fire*
*をつけることで、一回のコマンド入力で変更が可能。
このページが親切に書かれていると思う。
- export:環境変数を表示したり、変更したりできる
設定されてる環境変数を表示させるには、コマンドライン上で、export -pとすれば、設定してるものの一覧が見れる。
環境変数の設定(要はエイリアスを設定するようなもの)として、例えば、runrootという名前で"/data/2017/La"まで飛べるようにするには、以下のようにしたらできる。
export runroot=/data/2017/La
こうすることにより、環境変数が設定される。ちゃんと設定されたかどうかの確認方法は、コマンドライン上でecho $runrootとして、設定した内容と一致したものが出力されたら成功。
ただ、このままでは一度ターミナルを消したら設定内容が消えてしまい、再度設定しないといけない。
このようなことにならないように、ターミナルを開いたと同時に.bashrcを読み込んだ際に、自動的に読み込むように設定する。
やり方は、設定した後にsource .bashrcとすればいい。
※すでに存在する環境変数の名前を別の設定の際にもう一度使ってしまうと、上書きされるから注意が必要!!!
※環境変数を削除したい場合は、unsetコマンドで削除できる。例えば、上で設定したrunrootを削除したかったら、以下のように書けばいい。
unset runroot
削除されてることを確認するには、echo $runrootとして、何も出力されなかったら削除されてる。
- diff:ファイルの違いなどを調べることができる
中身がほとんど一緒で、ちょっとだけ違う時などに、その違いだけを知ることができる。
オプションとして、-cで違いをコンテキスト形式で出力するや、-yで違いを横並びに出力できる。
- ln:ファイルのハードリンクとシンボリックリンクを作る
このコマンドは、ファイルのリンクを作成するためのコマンド。
ここでは、シンボリックリンクの作成の仕方について書く。ln -s [ファイル名] [リンク名]のような書き方でOK。以下に例を挙げる。
ln -s /data/2018Oct/analysis analysis
このように書くことで、いちいちanalysisディレクトリに行くまでcd /data/2018Oct/analysisとしていたのを、cd analysisとするだけで飛べる。
言ってしまえば、シンボリックリンクはショートカットを作っているようなものか。
- mount:HDDをマウントするときに使用する
ここでは、Ubuntu(おそらくLinux全般に言えると思うが、)でのHDDのマウントの仕方を説明する。※管理者権限がないとできない。
1. sudo fdisk -lでディスクサイズなどを確認し、マウントしたいHDDを探す。(/dev/sdxxなどである。)
→Linuxにおけるデバイスの命名法としては、最初に見つかったHDDは/dev/sdaと名付けられ、2番目に見つかったHDDは/dev/sdbと名付けられる。例えば、sda1とsda2は、それぞれシステムのディスクドライブの第1、第2パーティションを表す。
2. ディスクのファイルシステムを確認する。lsblk -fをし、目的のデバイス名がどのようなファイルシステムであるかを確認。例えばsdbの項目で、sdb1 ext4とあればファイルシステムはext4であることが分かる。(だいたいLinuxのファイルシステムは、ext4でフォーマットされている。)
3. 実際にマウントを行う。マウント先のディレクトリを作成し、そこにマウントする。オプションとしてreadとwrite権限を与えておく。今回はトップディレクトリ下に作成する例を示す。
sudo mkdir /data
sudo mount /dev/sdb1 /data --types=ext4 --options=rw
これでマウントされるはずである。
- tsp:複数のジョブをパラレルに行いたいときなどに使う
これは、時間のかかる複数のコマンド作業をキューイングシステムに突っ込むことで、パラレルに処理することが可能なコマンドである。後日詳細な使用方法を追加予定!
とりあえず、以下のページを貼っておく。
参考ページ1、参考ページ2、参考ページ3
Tips
1. ディレクトリ内のファイル名を一括変更(連番で付与)
方法1
例として、rawroot_run_44_1.root, rawroot_run_44_2.root,...とファイルがあった場合、これらをrawroot_run_0044_001.root, rawroot_run_0044_002.root,...に変更したい。やり方は以下。
1. ls | awk '{ printf "mv %s rawroot_run_0044_%03d.root\n", $0, NR }' (これで変更後のファイル名を一度確認)
2. ls | awk '{ printf "mv %s rawroot_run_0044_%03d.root\n", $0, NR }' | sh (パイプでshに流して実行)
方法2
別の方法として、renameコマンドがある。Macではデフォルトで入っていないので、brew install renameでインストールしておく。
renameコマンドの場合、例えば、test_run1_foo.root, test_run2_foo.root, ...というファイルをtest_run1_foobar.root, test_run2_foobar.root, ...にしたかったら、rename "s/[変更前の文字列]/[変更後の文字列]/" [ファイル名]がフォーマットであるため、正規表現を用いて以下のように書けば変更可能。
rename "s/foo/foobar/" *.root
2. zshで重複したPATHを削除(Macの場合)
やることは以下のコマンドを打つだけ。
typeset -U PATH
上記のコマンドを打ったら、echo $PATH | tr ':' '\n'で確認する。
(PATHを1つずつ改行して確認したかったら、echo $PATH | awk 'BEGIN{FS=":"}{for(i=1;i<=NF;i++) {print $i};}'を打つ。)
3. ディレクトリ内のファイルの数やあるディレクトリに存在するディレクトリの数を数える方法
ファイル数のみを表示させるなら、「find . -type f | wc -l」 or 「ls -l | wc -l」
ディレクトリの数のみ表示させるなら、「find . -type d | wc -l」
※findコマンドは、ターミナル上からファイルを探したい場合にも使用可能。
拡張子が.cppで、calcの名前がついたファイルを検索する場合は、以下のようにすれば良い。
find /home/[username] -name calc\*.cpp