【学習】Linuxコマンド　Day3

# はじめに
前々回と前回までで、だいたい以下のことを学習してきました。
* 環境構築
* viエディタを使ってみる
* 基本的なコマンド①
* コマンドラインの基本操作

ということで基本的なコマンド①に続いて、ファイル操作のコマンド(基本的なコマンド②となる)を学習していきたいと思います。

# 今日学んだ、学ぶこと
* ディレクトリの作成(複数階層含)
* 空のファイル作成
* ファイル、ディレクトリの削除
* ファイル、ディレクトリの移動
* ファイル、ディレクトリの名前の変更
* ファイル、ディレクトリのコピー
* ファイル、ディレクトリの検索

### ディレクトリの作成(mkdirコマンド)
作成するディレクトリの名前を引数に指定して使用します。
```
$ mkdir work
```
このように入力して実行すると、カレントディレクトリがhome/imagataであった場合は
home/imagataにworkというディレクトリができるはずです。
lsコマンドで確認し、cdコマンドで移動してみましょう。
```
$ ls
work
$ cd work
$ pwd
home/imagata/work
```
このように、ディレクトリ作成後、移動することができていると思います。

### 複数階層を作成
mkdirコマンドはデフォルトでは saki/qiita のように複数の階層を一気に作成することはできません。
しかし、-pオプションを使用することで作成が可能になります。
上記で使用したwork内で行ってみます。
```
$ mkdir -p saki/qiita
$ ls -F
saki/
$ls -F saki
qiita/
```

複数階層ができていることが確認できたかと思います。
### 空のファイルの作成(touchコマンド)
touchコマンドを使用することで空ファイルを作成することができます。
```
$ touch newFile
$ ls -F
$ ls -l newfile
-rw-rw-r--. 1 imagata imagata 0 Sep 3 16:27 newfile
```
これでnewfileという名前の空ファイル(0バイト)のファイルを作成することができました。
引数を複数指定して、複数のファイルを同時に作成することも可能です。
ここで気になるのが"もし既存のファイル名と同じ名前でtouchコマンドを使用したらどうなる？"という疑問があると思いますが、その場合はタイムスタンプが更新されるだけで、空ファイルで上書きされてしまう。ということはありません。
上記で一度newfileを作成した後に以下を実行すると
```
$ touch newFile
$ ls -F
$ ls -l newfile
-rw-rw-r--. 1 imagata imagata 0 Sep 3 16:32 newfile
```
最初に作成した5分後に実行したのでタイムスタンプが16:27から16;32になりました。

### ファイル、ディレクトリの削除(rm,rmdirコマンド)
ファイル、ディレクトリの削除共にrmコマンドを使用しますが、空のディレクトリを削除するコマンドとしてrmdirコマンドがあります。ここは個人的に注意が必要なポイントと感じましたので表にしてみました。
| コマンド | ファイルの削除 | 中身のあるディレクトリの削除 |空のディレクトリの削除 |
|:---:|:---:|:---:|:---:|
| rm| 〇| 〇 |〇|
| rmdir| ×|  ×|〇|

ここから何がいえるのかというと、rmコマンドは削除という観点ではあまり制限はないが、rmdirコマンドは空のディレクトリに対してしか働かない。つまり、あえて制限されていることで空のディレクトリに対し削除を行いたい。と思ったときは積極的にrmdirコマンドを使用することでミスを防げるということ。
それでは実際に試してみましょう。
### rmコマンド
まずはファイルの削除を行ってみます。
```
$ touch testfile
$ ls -F
testfile
$ rm testfile
$ ls -F
```
touchコマンドでファイルを作成後にlsコマンドでファイルを作成できたことを確認できましたが、rmコマンドで削除したことにより、次のlsコマンドでは表示されないことを確認できたかと思います。
次にディレクトリの削除です。
```
$ mkdir test
$ ls -F
test/
$ rm -r test
$ ls -F
```
こちらもファイル同様ディレクトリ作成時はlsコマンドで表示されましたが、rmコマンドを実行したあとには削除されたことから表示されません。
ただし注意点として、ディレクトリを削除する際には"-rオプション"の指定が必要ということと、ディレクトリ内のファイルやディレクトリもまとめて削除されます。
rmコマンドは前段でもお伝えした通り、制限があまりなく削除できます。そのため注意を払わないまま使用してしまうとミスをしたときに大変です。(復元もできない)
そのため確認メッセージを表示するiオプションを使用します。
以下は例(touchコマンドでtestファイルを作成していることを前提とする)
```
$ rm -i test
rm:remove regular empty file 'test'? y
$ ls -F
```
-iコマンドを指定しておくことで削除前に確認メッセージが表示されることが確認できたと思います
メッセージに対してはy(yes)かn(no)でEnterで決定します。
### rmdirコマンド
空のディレクトリのみ削除が可能です。以下は例(空のtestディレクトリが作成されていることを前提とする)
```
$ rmdir test
$ ls -F
```
ちなみに中身が入っている場合(今回はtestディレクトリのqiitaファイルとする)はどうなるかというと
```
$ touch test/qiita
$ ls -F test
$ qiita
$rmdir test
rmdir:failed to remove 'test' : Directory not empty
```
このように空ではないというメッセージが出て失敗します。
だからこそ安心して空のディレクトリのみ削除できるという強みがあると考えます。

### ファイル、ディレクトリの移動(mvコマンド)
mvコマンドはファイル、ディレクトリを移動、名前を変更するコマンド
引数には①移動元のファイル名・ディレクトリ名 ②移動先のファイル名・ディレクトリ名を指定する必要がある
試しにqiitaファイルをtestディレクトリに移動させてみる。
```
$ ls -F 
qiita test
$ qiita
$ mv -i qiita test
$ ls -F test
qiita
```
qiitaファイルがtestディレクトリに移動したことが確認できました。
rmコマンド同様-iオプションを指定することが可能で、注意しないまま上書きすることを防ぐことができます。
### ファイル、ディレクトリの名前を変更(mvコマンド)
移動の際に使用するmvコマンドで移動先に存在しない名前を指定することで名前を変更することができる。
```
$ touch testfile
$ ls -F
testfile
$ mv testfile testname 
$ ls -F 
testname
```
testfile→testnameの様にファイルの名前が変更されたことが確認できる。

### ファイルのコピー(cpコマンド)
cpコマンドを使用することで指定したファイルを指定したディレクトリの中にコピーする
第一引数がファイル(ディレクトリ名)、第二引数がコピー先となる
```
$ cp testname test
$ ls -F test
testname
$ ls -F test testname
```
カレントディレクトリにあるtestnameファイルがtestディレクトリの中にコピーされたことが確認できた。
コピー先に指定したファイル名と同様のファイルが存在する場合、上書きされてしまうが、こちらについても-iオプションを指定することができるので、確認メッセージが表示されるようにできる。

### ディレクトリのコピー(cpコマンド)
ファイル同様第一引数がコピーされる対象、第二引数がコピー先となるが、ディレクトリをコピーする場合、そのまま入力して実行しようとするとエラーが発生する。

例:testdirをtestdir2内にコピーしたい
```
$ cp testdir testdir2
cp:omitting directory 'testdir'
```
ディレクトリをコピーする場合は-rオプションを指定する
```
$ cp -r testdir testdir2
$ ls -F testdir
testdir2
```
エラーは起きずにコピーされたことが確認できました。

### ファイル、ディレクトリの検索(findコマンド)
findコマンドを使用することでファイルやディレクトリを検索して見つけ出すことができる。
findコマンドはこれまで紹介したコマンドと少し異なり、引数を3つ指定する必要がある。第一引数から順番に記載。
1. 検索開始ディレクトリ
1. 検索条件
1. アクション

検索開始ディレクトリで指定した階層より下の階層から検索を行い、
検索条件にて名前で検索を行う場合は
```
-name 検索文字列
```
この際にワイルドカード(*)を使用することも可能
```
-name '*.txt'
```
上記の場合は.txtで終わる名前という意味。

ファイル種別で通常のファイルを指定して検索を行う場合は

```
-type f
```
ファイル種別でディレクトリを指定して検索を行う場合は

```
-type d
```

アクションでヒットしたファイルorディレクトリに対してどのような操作を行うか指定する
表示する場合は

```
-print
```
削除する場合は
```
-delete
```

実際に検索を行ってみる。
検索したい内容をworkディレクトリ内に存在するファイルを表示する

```
$find ~/work -type f -print
home/imagata/testname
```
今回はtestnameというファイルのみ作成していたので上記の様に表示された。
他にもファイルが存在すればファイルごとに一行ずつ表示される。

# おつかれさまでした
今回はファイルの基本的な操作について学習しました。今回の実践を通して前回学習したコマンドを使用する機会も多かったため、少しは力が身についたかと思います。
そして、ファイルの操作を行っていくなかで、繰り返しにはなりますが、注意するべき点として、「うっかり上書きしてしまった！」「削除してしまった！」ということにならないようにオプションを使用する癖付け、なぜ制限付きのコマンドがあるのか、という点も含めて覚えておくべきだと感じました。
以上です。