Linuxコマンド入門(2) ~ファイル操作~


　CUIベースでファイル操作を行うには色々と方法があり，覚えておくといいテクニックもたくさんあります．
 
　ここでは，ファイル操作に関するコマンドをまとめていきます．扱うコマンドは

* ファイルの基本操作

|コマンド|語源|意味|
|:---:|:---:|---|
|cp|copy|ファイルのコピーを作成
|mv|move|ファイルの移動，改名
|rm|remove|ファイルの削除

* ファイルの検索・詳細

|コマンド|語源|意味|
|:---:|:---:|---|
| find|-|ファイルを検索する
| ls -l|list (long)|ファイルの詳細を表示する
|file|-|ファイルの情報を表示する

* ファイルの表示

|コマンド|語源|意味|
|:---:|:---:|---|
|cat|concatenate|ファイルの内容を標準出力に表示する．
|more|-|ファイルの内容を1ページ分のみ表示する．Enterで一行更新．
|less|-|ファイルの内容を1ページ分のみ表示する．上下に移動できる．
|head|-|ファイルの先頭を表示する．
|tail|-|ファイルの末端を表示する．
|grep|g/re/p|ファイルの内容のうち指定した文字列と一致する部分を表示する．

となっております．それではよろしくお願いいたします．

# 環境
* Cent OS 6.8

# ファイルの基本操作
## cp
　**cp**コマンドはファイルを**コピー**するのに用いられます．
 
```shell-session
$ cp SOURCE TARGET
$ cp SOURCE TARGETDIR
$ cp -r SOURCEDIR TARGETDIR
```

　SOURCEはコピー元，TARGETはコピー先のファイル名です．別のディレクトリにコピーを作るときはTARGETにディレクトリ名のみを指定することもできます．ファイル名はコピー元と同じになります．
 
　ディレクトリをコピーすることもできますが，中身を一緒にコピーするときはrオプションを付ける必要があります．rオプションは”recursive”の意味で，再帰的にフォルダの中身をコピーしていきます．

　l, sオプションによってハードリンク，シンボリックリンクの作成にも使えますが，詳細はここでは省きます．
 
## mv
　**mv**コマンドはファイルを移動するのに使います．名前を変更するときに使うこともできます．

```shell-session
$ mv FILE DIR        # FILEをDIRディレクトリに移動します
$ mv FILE DIR -i    # 移動先のディレクトリに同名のファイルがあった場合，上書きするかどうかを尋ねます．
        # 確認なしで上書きする場合は -f
        # 確認なしで上書きしない場合は -n
        
$ mv FILE DIR/RENAME        # FILEをDIRディレクトリに移動し，RENAMEに名前を変更します
```

## rm
　**rm**コマンドはファイルを削除します．ディレクトリ内部のファイルを，そのディレクトリごと削除することもできます．

```shell-session
$ rm FILE        # FILEを削除します
$ rm FILE1 FILE2 FILE3        # FILEを複数削除することもできます
$ rm -i FILE        # FILEを削除する前に確認するプロンプトを表示させます
        # 削除するときはy, スキップするときはn

$ rm -r DIR        # DIRを中身のファイルごとすべて削除します
```

　また，ルートディレクトリは間違って削除するとシステムがすべてダウンしてしまうので，デフォルトで削除できないようになっています．ですが，-fオプションをつけるとすべて強制的に削除してしまいます．一時期話題になった`rm -rf /`とは，「ルート以下すべてのファイルを強制削除」という意味になります．間違っても実行しないようにしてください．せめてiオプションを付けておくことをおすすめします．
 
# ファイルの検索・詳細
## find
　**find**は，指定したパスの下を検索します．`find [オプション] [パス] [表現]`のように使い，[表現]には「オプション」「判別式」「アクション」を書きます．例えばこんな使い方があります．
 
```shell-session
$ find ~/ -name "*.txt"        # ホームディレクトリ以下で拡張子がtxtのファイルを検索して表示します
$ find -name "test*" -and -size +100k -fprint result
        # カレントディレクトリ以下でtestで始まるファイルのうちサイズが100KB以上のものをresultに書き出します．
$ find ~/Documents -exec cp {} ~/Documents-backup \;
        # Documentsフォルダ以下のすべてのファイルをDocumetns-backupに移動します．
```

![find_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/9e25b6a9-60d8-b7cb-7a72-d7e310a97a9d.png)

　こちらのサイトなどが参考になります．
 
 * [【 find 】 ファイルやディレクトリを検索する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230777/)
 * [findコマンドで覚えておきたい使い方12個(+1個)](https://orebibou.com/2015/03/find%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B912%E5%80%8B/)
       
## ls -l
　**ls -l**コマンドの引数にファイル名を指定すると，ファイルのパーミッションや所有者を確認できます．シンボリックリンクを指定すれば，リンク先が表示されます．
 
## file
　**file**コマンドは，ファイルの種類を特定するコマンドです．拡張子が不明なファイルなどを調べるのに役に立ちます．
 
```shell-session
$ file hello.txt
hello.txt: ASCII text
$ mv hello.txt hello.png
$ file hello.png
hello.png: ASCII text        # ファイルの拡張子にはよらない
```

# ファイルの表示
## cat
　**cat**コマンドは，ファイルや標準入力を標準出力に出力します．複数のファイルを結合したり，オプションで付加情報を付けたりすることができます．
 
```shell-session
$ cat FILE        # FILEの内容を標準出力に出力します
$ cat FILE -n        # FILEの内容を行番号を添えて出力します
$ cat FILE1 - >> FILE2        # FILE1の内容と標準入力からの入力をFILE2に書き加えます
        # 標準入力はCtrl+Cで入力完了します
        # >>はファイルへの書き込みを表します
        # >はファイルへの上書きを表します
```
![cat_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/4f44273e-47cf-9760-c8ba-14622b57e35f.png) 

## more
　1ページ分ファイルを表示します．Enterを押すと次の行に移動していきます．後戻りはできません．
 
## less
　1ページ分ファイルを表示します．上下にスクロールすることができるほか，様々なコマンドを使うことができます．moreとviの両方の移動方式が使えます．vでエディタ起動，!でシェル起動，qで終了です．Nオプションで行番号の表示もできます．こちらの記事も参考になります．
 
* [エンジニアなら知っておきたい lessコマンドtips 11選](http://qiita.com/ine1127/items/64b5b6cf52471c3fe59c)
* [lessコマンドを少し便利にしておく](http://qiita.com/hatchinee/items/586fb1c4915e2bb5c03b)

## head, tail
　headはファイルの先頭，tailはファイルの末尾を表示するコマンドです．-nオプションで行数を指定できます．

## grep
　**grep**はファイル全体から正規表現に一致する行を表示するコマンドです．正規表現の代わりに使える表現によって，fgrep, egrepなどの拡張コマンドもあり，-F, -Eというオプションで利用することができます．grepの使い方は次の通りです．

```shell-session
$ grep "hoge" *.txt        # テキストファイルからhogeを検索
$ grep -A 5 "hoge" *.txt        # 検索結果の行以下5行を一緒に表示
$ grep -ln "hoge" *.txt        # hogeを含むファイルの名前を表示し行番号も添える
```

　パイプで前のコマンドから受け取ったデータに対してgrepをかけることもよくあります．こちらのサイトも参考になります．
 
* [【 grep 】 文字列を検索する](http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230786/)
* [grepコマンドで覚えておきたい使い方14個(+3個)](https://orebibou.com/2014/12/grep%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B914%E5%80%8B/)

 
---- 以上

# こちらもよろしくお願いいたします．
### [エンリュの迷い森｜トップページ][blogtop]

[blogtop]: http://lost-in-forest.hatenablog.com/entry/toppage