# 17.6.3. ファイルの操作
**Source**: https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/shell/fs/ope-file/
**Parent**: https://hwb.ecc.u-tokyo.ac.jp/hwb2023/literacy/email/
ここでは、コマンドライン上からのファイルの操作方法について説明します。
- ファイルやディレクトリの複製・移動・削除(`cp`, `mv`, `rm` コマンド)
- ファイル内容の表示(`cat`, `less`, `lv` コマンド)
- ファイルの作成(`cat`, `touch` コマンド)
ファイルやディレクトリの複製・移動・削除の操作については、Finder では[11.4. ファイルの操作](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/literacy/filesystem/file)
と対応します。
## ファイルやディレクトリの複製 [#](#cp)
ファイルやディレクトリの複製を行うには、`cp` コマンドを利用します。
cp (コピー元) (コピー先)
例えば、カレントディレクトリに foo.txt が存在する状況で
ls
```
foo.txt
```
foo.txt を複製した bar.txt というファイルを作ります。
cp foo.txt bar.txt
ls
```
bar.txt foo.txt
```
また次の例では、foo.txt を親ディレクトリに同じ名前でコピーしています。
cp foo.txt ..
> 注意 — コピー先に既に同じ名前のファイルがあった場合。新しいファイルで上書きされ、元の内容は永久に抹消されます。**復活させる方法はありません**。
なお、`-i` オプションをつけることで、本当に上書きしてよいか確認することができます。
cp -i foo.txt bar.txt
```
overwrite ../foo.txt? (y/n [n])
```
上書きするか? と聞かれました。自信がある場合は `y` をそうでない場合は `n` を入力します。
> `y/n [n]` のような表記は、「yes なら `y` を no なら `n` を入力し、
> せよ。なお文字を入力せずに
> した場合は `n` が入力されたと扱う」と読みます。
`cp` コマンドは、ディレクトリの複製にも使用することができます。ただし、その際には `-r` オプション\*\*をつける必要があります。
cp piyo/fuga ~/tmp
```
cp: piyo/fuga is a directory (not copied).
```
オプション無しの場合はエラーになりました。
cp -r piyo/fuga ~/tmp
さて、ここで 2 行目の実行結果について見てみると、次のようになります:
- コピー先の ~~/tmp が存在していなければ、コピー元の piyo/fuga というディレクトリが、~~/tmp という名前でコピーされます。
- もし ~/tmp が既に存在していれば、その中に fuga という(コピー元と同じ名前の)ディレクトリが作られます。
次の例は、piyo/fuga というディレクトリをカレントディレクトリにコピーします。カレントディレクトリは存在しているので、fuga というディレクトリがカレントディレクトリの真下にできることになります。
cp -r piyo/fuga .
ls
```
bar.txt foo.txt fuga hwb piyo
```
なお、ここで「cp piyo/fuga/ .」とコピー元の最後に「/」をつけると、教育用計算機システムでは fuga ディレクトリ**の中身**がコピーされることになりますので、気をつけてください。
教育用計算機システムの Mac 環境において、`/home/hwb/exercise/hanako/occupation.txt` を自分のデスクトップにコピーしてみましょう。`cp /home/hwb/exercise/hanako/occupation.txt ~/Desktop` とします。デスクトップに現れたコピーされたファイルのアイコンをダブルクリックし、そこに書いてある花子さんの職業を見てみて下さい。花子さんの職業は何でしょう。
- 運転手
- 客室乗務員
- 学生
- 教師
必要がなければ、練習が終わったら、コピーしたファイルを削除しておきましょう。
## ファイルやディレクトリの移動 [#](#move)
ファイルやディレクトリの移動には、`cp` コマンドの代わりに `mv` コマンドを利用します。使い方はほぼ同じです。
移動の場合は、ディレクトリの移動も `-r` オプションなしに可能です。
mv (移動元パス) (移動先パス)
> 移動先がファイルの場合、
> `cp` コマンドと同じように、移動先に既に同じ名前のファイルがあった場合は移動したファイルで上書きされ、元の内容は永久に抹消されます。復活させる方法はありません。
`-i` オプションをつけることで、本当に上書きしてよいか確認することができます。
例えば、次の2つめのコマンドはカレントディレクトリにある foo.txt を(カレントディレクトリの)baz.txt に移動させます。これは名前の変更を行っていることに相当します。
ls
```
bar.txt foo.txt hwb piyo
```
mv foo.txt baz.txt
ls
```
bar.txt baz.txt hwb piyo
```
また、次の例は、bar.txt を piyo というディレクトリに移動させます。
mv bar.txt piyo/
ls
```
baz.txt hwb piyo
```
ls piyo
```
bar.txt fuga
```
cp のときと同様に、ディレクトリを移動する次のコマンド
mv piyo/fuga ~/tmp
は、次のように動作します。
- 移動先の ~~/tmp が存在していなければ、移動元の piyo/fuga というディレクトリが、~~/tmp という場所に名前・位置になります。
- もし ~/tmp が既に存在していれば、その中に fuga という(移動元と同じ名前の)ディレクトリが作られます。
## ファイル・ディレクトリの削除 [#](#rm)
ファイルやディレクトリの削除には、`rm` コマンドを用います。ディレクトリを削除するには、`-r` オプションを指定する必要があります。
rm (パス)
rm -r (ディレクトリのパス)
> 削除したファイルやディレクトリを復活させる方法はありません。日常的にはFinder のゴミ箱へ移動を使う方が無難です。
`-i` オプションをつけることで、本当に削除してよいか確認することができます。
なお、ディレクトリを`-r` オプションなしで削除しようとすると、例えば
rm piyo
```
rm: piyo: is a directory
```
のようにエラーが表示されます。実際の削除は行われません。
## ファイル内容の表示 [#](#cat)
ファイルの中には、**テキストファイル**という(人間が読める)文字データだけが書かれたファイルがあります。代表例としては、シェルスクリプト([17.3. シェルスクリプト](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/shell/shellscript)
)や、TeX ソース([18. LaTeX](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/latex)
)などがあります。テキストファイルの内容は、`cat`, `less`, `lv` といったコマンドで表示させることができます。ここでは、これらのコマンドの使用例を解説します。
`cat` コマンドは、ファイルの中身を一挙に表示させるコマンドです。引数に表示させたいファイル名を指定します。その性質上、1 画面に収まらないような長いファイルには不向きです。下の例は、memo.txt というファイルの中身を画面に一挙に表示させます。
cat memo.txt
1 画面を超えるような長いテキストファイルを読むには、`less`, `lv` といったコマンドを使います。これらは 1 画面単位で内容を表示するプログラムで、**ページャ**と総称されます。
### less コマンド [#](#less)
`less` コマンドは、`cat` コマンドと同じように、表示させたいファイルの名前を後ろに指定して使います。
less memo.txt
1 画面分を表示したところで一旦停止します。
キーを押すと、1 画面分スクロールして続きを見ることができます。上下の矢印キーを使って、1 行ずつ見る範囲を変えることもできます。終了するには `q` キーを押します。
less 起動中に `h` キーを押すか、
less --help
として起動すると、キー操作のヘルプが表示されます。
代表的な操作方法を下にまとめます。一つの操作に対し、複数の方法が用意されている場合が多いです。
| 操作 | キー |
| --- | --- |
| less の終了 | `q`, `Q`, `Z`, `Z` など |
| 1画面進む | `f` |
| 1画面戻る | `b` |
| 半画面進む | `d` |
| 半画面戻る | `u` |
| 1行だけ進む | `e`, `j`, カーソル下 など |
| 1行だけ戻る | `y`, カーソル上 など |
| 先頭へ | `<` |
| 末尾へ | `>` |
### lv コマンド [#](#lv)
`lv` コマンドは、ほぼ `less` コマンドと使い勝手は同じです。
`lv` コマンドでは文字コード([12.4. 人のための文字](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/information/text/character)
)の自動判別がなされる、日本語のテキストファイルを読むには `lv` コマンドの方が便利かもしれません。一方、`less` コマンドにだけあって `lv` コマンドにはない機能もあります。
`/home/hwb/exercise/taro/interest.txt` というファイルには、太郎くんの興味があるものが書いています。彼の興味がある科目は何でしょうか。
`cat`コマンドなどを用いて調べてみましょう。
- 体育
- 数学
- 国語
## ファイルの作成 [#](#echo)
通常、テキストファイルを作るには `mi` などのエディタをを用います。
1, 2行のテキストファイルなら、コマンドラインから直接ファイルを作ることもできます。
`echo` コマンドはあとに指定された文字列をそのまま出力します。
これと**リダイレクション**を組み合わせ、`>` に続けてファイル名を指定すると、`echo`が出力する文字列を内容として持つファイルを作成することができます。
([17.5. パイプとリダイレクション](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/shell/pipe_and_redirection)
)
次の例は `addr.txt` というファイルを作ります。
echo 3-8-1 Komaba Meguroku Tokyo > addr.txt
コマンドラインを利用してファイルを作成する場合、`>`を使ったという方法を使うことが多いです。大雑把にいうと、コマンドの出力結果を画面ではなくファイルに変更することでファイルを作る、ということになります。
> ファイルが既に存在する場合 `>` は削除と上書きとして動作します。`>>` と不等号を二つ重ねると1行追加になります。
`cat` コマンドを使って複数行のファイルを作ることもできます。例えば、memo.txt を作るには次のようにします。
cat > memo.txt
ここで、カーソルは行頭に移動し入力待ちの状態になります。この状態でどんどん新しい文章を入力していきます。
```
HumptyDumpty sat on a wall.
HumptyDumpty had a great fall.
```
入力を終わりにするには、最後の行を入力し終わった後(行末で
まで押した後)で
d
\*を押します。
また `touch` コマンドを使うと、「空ファイルを作る」ことができます。
hoge.txt
ファイルがすでに存在する場合は更新時刻が現在時刻に更新されます(ファイルの内容は変わらない)。