インフラエンジニアの羅針盤

インフラエンジニア1〜3年目のための技術ガイド

Linux基本コマンド ファイル操作の実践入門

公開更新

Linuxエンジニア養成講座 第7回|全36回・フェーズ2「Linux基礎」の4回目です。
前回までに学んだこと: Linuxのディレクトリ構造とFHS、df・du・mountによるディスク使用量の確認(第6回)。
今回学ぶこと: ファイルの作成・コピー・移動・削除、ファイル内容の閲覧、ファイルの検索と圧縮。

前回はLinuxの「どこに何があるか」というディレクトリ構造を学びました。今回はその構造の上で、ファイルやディレクトリを実際に操作するコマンドを身につけます。冒頭では、今後のシリーズで使う便利なツールのインストール(dnf install)も初めて体験します。

この回の学習目標

  • dnf install でパッケージを追加インストールできる
  • man コマンドでコマンドのマニュアルを参照できる
  • mkdircpmvrm でファイルとディレクトリの作成・コピー・移動・削除ができる
  • catlessheadtail でファイルの中身を確認できる
  • find で条件に合うファイルを検索し、tar でアーカイブ・展開ができる
目次
    1. この回の学習目標
  1. なぜファイル操作コマンドを覚えるのか
  2. 準備 — 便利ツールをインストールする
    1. ネットワーク設定の確認
    2. dnf installで5つのパッケージを導入する
    3. インストールしたものを確認する
    4. manコマンドの使い方
  3. ファイルとディレクトリの基本操作
    1. ディレクトリを作る・消す(mkdir, rmdir)
    2. ファイルを作る(touch)
    3. コピーする(cp)
    4. 移動・名前変更する(mv)
    5. 削除する(rm)
  4. ファイルの中身を見る
    1. まるごと見る(cat)
    2. ページ送りで見る(less)
    3. 先頭・末尾だけ見る(head, tail)
    4. 行数・単語数を数える(wc)
  5. ディレクトリ構造を見渡す(tree)
  6. ファイルを探す(find, xargs)
  7. ファイルをまとめる・圧縮する(tar, gzip)
  8. やってみよう — 総合演習
  9. 理解度チェック
  10. まとめ

なぜファイル操作コマンドを覚えるのか

もし100台のサーバーすべてにGUIでログインして、マウスで設定ファイルを開いて編集していたらどうなるでしょうか。少し考えてから読み進めてください。

Linuxサーバーの管理は、突き詰めると「ファイルを操作すること」です。設定を変更するなら設定ファイルを編集する。ログを調べるならログファイルを読む。バックアップを取るならファイルをコピー・圧縮する。どの作業にも、ファイル操作コマンドが土台として必要になります。

GUIのファイルマネージャーに慣れている方は、コマンドでのファイル操作を面倒に感じるかもしれません。しかし、サーバーにはGUIがないのが普通です。Minimal Installで構築した検証環境のalma-mainにも、デスクトップ環境は入っていません。コマンドでのファイル操作は、サーバー管理における唯一の手段です。

また、コマンドは再現性があります。同じコマンドを実行すれば、誰がやっても同じ結果が得られます。手順書に「このコマンドを実行してください」と書けば、それだけで正確に伝わります。GUIでの操作を手順書にすると「このボタンをクリックして」「次にこのメニューを選んで」と長くなり、伝達ミスの原因にもなります。

準備 — 便利ツールをインストールする

ファイル操作の学習に入る前に、今後のシリーズで使う便利なツールをインストールします。AlmaLinuxのMinimal Installには、必要最小限のパッケージしか含まれていません。tree(ディレクトリ構造の可視化)、tar(ファイルのアーカイブ)、vim(テキストエディタ)といったツールは、自分で追加する必要があります。

ネットワーク設定の確認

第7回以降、dnf install でパッケージをインストールする場面が増えます。お使いの環境によっては、インターネットへの接続にプロキシサーバーの設定が必要になる場合があります。

  • 企業環境で学習している方 — 社内プロキシのアドレスを /etc/dnf/dnf.conf に設定してください。プロキシのアドレスとポート番号はネットワーク管理者に確認してください。設定方法は下記「プロキシ設定の追加手順」を参照してください
  • 自宅などの個人環境で、VMから直接インターネットに接続できる方 — プロキシ設定は不要です。この手順をスキップして「dnf installで5つのパッケージを導入する」に進んでください
  • 筆者の検証環境(alma-proxy)を再現している方 — 下記の手順で proxy=http://10.0.1.254:3128 を設定してください

プロキシの仕組みは第18回で詳しく学びます。今は「インターネットへの中継サーバー」程度の理解で大丈夫です。

プロキシ設定の追加手順

以下のコマンドはすべてalma-mainにSSH接続した状態で実行します。

実行コマンド:

$ sudo vi /etc/dnf/dnf.conf

[main] セクションの末尾に以下の形式で1行を追加します。vi の操作は第9回で学びますが、今は以下の手順で進めてください。G キーでファイル末尾に移動 → o キーで新しい行を追加 → 以下を入力 → Esc キー → :wq で保存終了。

proxy=http://プロキシのアドレス:ポート番号

筆者の検証環境の場合

筆者の検証環境では alma-proxy(10.0.1.254:3128)を使用しているため、以下の1行を追加します。

proxy=http://10.0.1.254:3128

設定後のファイルは以下のようになります。

実行コマンド:

$ cat /etc/dnf/dnf.conf

実行結果:

[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
skip_if_unavailable=False
proxy=http://10.0.1.254:3128

プロキシを設定した場合、末尾に proxy= の行が追加されています。この設定により、dnf コマンドは指定したプロキシサーバーを経由してパッケージをダウンロードします。プロキシとは何か、なぜ企業環境で必要なのかは第18回「企業ネットワークの仕組み」で改めて学びます。

dnf installで5つのパッケージを導入する

Linuxでソフトウェアをインストールするには、パッケージマネージャーを使います。AlmaLinux 9では dnf がパッケージマネージャーです。Windowsでいう「アプリの追加と削除」に近い役割ですが、コマンド1つでダウンロードからインストールまで自動で行われます。パッケージ管理の詳細は第19回で扱います。ここでは「ソフトウェアを追加するためのコマンド」として使い方を体験してください。

パッケージのインストールにはシステム全体に影響を与える管理者権限が必要です。コマンドの先頭に sudo を付けると、管理者(root)権限で実行できます。sudo やユーザー管理の詳細は第10回で学びます。今は「管理者権限が必要なコマンドの前に付けるもの」と覚えておけば大丈夫です。

それでは、パッケージをインストールします。

実行コマンド:

$ sudo dnf install tar vim-enhanced tree man-pages bash-completion

実行すると、インストール対象のパッケージとその依存パッケージが一覧表示され、確認を求められます。

依存関係が解決しました。
================================================================================
 パッケージ              Arch       バージョン           リポジトリー     サイズ
================================================================================
インストール:
 bash-completion         noarch     1:2.11-5.el9         baseos           456 k
 man-pages               noarch     5.10.2-5.el9         baseos           2.1 M
 tar                     x86_64     2:1.34-7.el9         baseos           880 k
 tree                    x86_64     1.8.0-10.el9         baseos            64 k
 vim-enhanced            x86_64     2:8.2.2637-21.el9    appstream        1.7 M
依存関係のインストール:
 gpm-libs                x86_64     1.20.7-29.el9        appstream         20 k
 vim-common              x86_64     2:8.2.2637-21.el9    appstream        6.6 M
 vim-filesystem          noarch     2:8.2.2637-21.el9    appstream         48 k
アップグレード:
 man-db                  x86_64     2.9.3-7.el9          baseos           1.1 M
 vim-minimal             x86_64     2:8.2.2637-21.el9    baseos           703 k

トランザクションの概要
================================================================================
インストール  8 パッケージ
アップグレード  2 パッケージ

ダウンロードサイズの合計: 14 M
これでよろしいですか? [y/N]:

y を入力してEnterを押すとインストールが始まります。「完了しました!」と表示されれば成功です。パッケージのバージョンや依存関係の表示はお使いの環境や実行時期によって異なる場合があります。パッケージ名が合っていれば問題ありません。

インストールした5つのパッケージの役割は以下のとおりです。

  • tar: 複数のファイルを1つにまとめる(アーカイブ)ツール。Minimal Installには含まれていない
  • vim-enhanced: 高機能テキストエディタ。使い方は第9回で学ぶ
  • tree: ディレクトリ構造をツリー形式で表示するツール
  • man-pages: コマンドのマニュアル(説明書)ページ集
  • bash-completion: Tabキーによるコマンド補完を強化するツール

依存関係として man-db がアップグレードされていることにも注目してください。man-db はマニュアルを検索・表示するための仕組みで、Minimal Installにも最初から含まれています。今回追加した man-pages はマニュアルの「中身」にあたるもので、両方揃って初めて役に立ちます。

bash-completion をインストールした直後は、補完機能がまだ読み込まれていません。シェルを再起動して有効にします。

実行コマンド:

$ exec bash

見た目には何も変わりませんが、シェルが再起動され、bash-completionが読み込まれた状態になります。これ以降、コマンド名やオプション名の途中でTabキーを押すと、候補が自動補完されます。たとえば systemc と入力してTabキーを押すと systemctl に補完されます。

インストールしたものを確認する

インストールしたパッケージが正しく入っているか、バージョンを確認してみます。

実行コマンド:

$ tar --version

実行結果:

tar (GNU tar) 1.34
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者: John Gilmore, Jay Fenlason.

実行コマンド:

$ tree --version

実行結果:

tree v1.8.0 (c) 1996 - 2018 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro

どちらもバージョン情報が表示されれば、インストールは正常に完了しています。

manコマンドの使い方

man(manual)コマンドは、コマンドの使い方を調べるためのマニュアルを表示します。コマンドのオプションを忘れたとき、最も確実な情報源になります。

実行コマンド:

$ man cp

マニュアルが表示されたら、以下のキーで操作します。

  • スペース または f: 次のページへ進む
  • b: 前のページへ戻る
  • /検索語: マニュアル内を検索する(例: /-r で「-r」を検索)
  • n: 次の検索結果へ移動
  • q: マニュアルを閉じる

マニュアルの操作方法は、この後登場する less コマンドと同じです。man は内部で less を使ってマニュアルを表示しているためです。

今後、コマンドのオプションに迷ったら、まず man コマンド名 を実行してみてください。Web検索より正確で、そのサーバーにインストールされているバージョンに対応した情報が得られます。

ファイルとディレクトリの基本操作

ここからは、ホームディレクトリ(/home/developer)で作業します。現在のディレクトリを確認してから始めます。

実行コマンド:

$ pwd

実行結果:

/home/developer

/home/developer と表示されていれば、ホームディレクトリにいる状態です。別のディレクトリにいた場合は、cd ~ でホームディレクトリに戻ってください。

ディレクトリを作る・消す(mkdir, rmdir)

mkdir(make directory)でディレクトリを作成します。

実行コマンド:

$ mkdir practice

実行コマンド:

$ ls -l

実行結果:

合計 0
drwxr-xr-x. 2 developer developer 6  3月 29 10:00 practice

先頭の d はディレクトリであることを示しています。rwxr-xr-x はパーミッション(アクセス権限)で、詳しくは第11回で学びます。

深い階層のディレクトリを一度に作りたい場合は、-p オプションを使います。

実行コマンド:

$ mkdir -p practice/sub1/sub2

-p を付けないと、途中のディレクトリ(sub1)が存在しない場合にエラーになります。-p は「途中の階層もまとめて作る」という意味です。

空のディレクトリを削除するには rmdir(remove directory)を使います。

実行コマンド:

$ rmdir practice/sub1/sub2

rmdir は対象が空でないとエラーになります。ファイルが入ったディレクトリを削除する方法は、後述の rm -r で説明します。

ファイルを作る(touch)

touch コマンドは、空のファイルを作成します。本来は「ファイルのタイムスタンプを更新する」コマンドですが、指定したファイルが存在しない場合は新規作成されるため、空ファイルの作成に広く使われています。

実行コマンド:

$ touch practice/file1.txt practice/file2.txt practice/file3.txt

実行コマンド:

$ ls -l practice/

実行結果:

合計 0
-rw-r--r--. 1 developer developer 0  3月 29 10:01 file1.txt
-rw-r--r--. 1 developer developer 0  3月 29 10:01 file2.txt
-rw-r--r--. 1 developer developer 0  3月 29 10:01 file3.txt
drwxr-xr-x. 2 developer developer 6  3月 29 10:00 sub1

サイズが 0 の空ファイルが3つ作成されました。先頭が -(ハイフン)になっている行が通常のファイルです。

コピーする(cp)

cp(copy)でファイルをコピーします。書式は cp コピー元 コピー先 です。

実行コマンド:

$ cp practice/file1.txt practice/file1_backup.txt

実行コマンド:

$ ls practice/

実行結果:

file1.txt  file1_backup.txt  file2.txt  file3.txt  sub1

ディレクトリをコピーする場合は -r(recursive: 再帰的)オプションが必要です。

実行コマンド:

$ cp -r practice practice_copy

-r を付けないと、ディレクトリのコピー時にエラーが出ます。ディレクトリの中にあるファイルやサブディレクトリも含めて丸ごとコピーするため、「再帰的」という表現が使われています。

移動・名前変更する(mv)

mv(move)はファイルやディレクトリを移動します。移動先のファイル名を変えれば、名前変更としても使えます。

実行コマンド:

$ mv practice/file3.txt practice/sub1/

実行コマンド:

$ ls practice/sub1/

実行結果:

file3.txt

ファイル名を変更する場合は、同じディレクトリ内で移動先に新しい名前を指定します。

実行コマンド:

$ mv practice/file2.txt practice/renamed.txt

実行コマンド:

$ ls practice/

実行結果:

file1.txt  file1_backup.txt  renamed.txt  sub1

Windowsとは異なり、Linuxには「名前変更」専用のコマンドがありません。mv が移動と名前変更を兼ねています。

削除する(rm)

rm(remove)はファイルを削除します。

実行コマンド:

$ rm practice/file1_backup.txt

Linuxでは、削除したファイルはゴミ箱に入りません。rm で消したファイルは基本的に復元できないため、実行前に対象を確認する習慣をつけてください。

ディレクトリを中身ごと削除するには -r オプションを使います。先ほど作った practice_copy を削除してみます。

実行コマンド:

$ rm -r practice_copy

practice_copy ディレクトリとその中のファイルがすべて削除されます。

現場ヒヤリハット: rm -rf の恐怖

現場で最も恐れられるコマンドの1つが rm -rf / です。-f は確認なしで強制削除、/ はルートディレクトリ(すべてのファイルの起点)を意味します。つまり「確認なしにシステム上の全ファイルを再帰的に削除する」というコマンドです。

特に危険なのが、シェルスクリプト内での変数展開ミスです。たとえば、変数 $DIR に削除対象のパスを入れて rm -rf $DIR/ と書いたとき、変数が空だった場合はどうなるでしょうか。シェルは rm -rf / として解釈します。

現在のLinuxでは --preserve-root オプションがデフォルトで有効になっており、rm -rf / は拒否されます。しかし rm -rf /*(ルート直下の全ディレクトリ)には効きません。rm-rf オプション付きで使うときは、削除対象のパスが間違いないことを必ず二重に確認してください。

ファイルの中身を見る

この節の演習用に、中身のあるファイルを準備します。/etc/hostname の内容をコピーして使います。

実行コマンド:

$ cp /etc/hostname practice/sample.txt

まるごと見る(cat)

cat(concatenate: 連結)はファイルの内容を丸ごと画面に表示します。短いファイルの確認に向いています。

実行コマンド:

$ cat practice/sample.txt

実行結果:

alma-main

行番号を付けて表示したい場合は -n オプションを使います。

実行コマンド:

$ cat -n /etc/dnf/dnf.conf

実行結果:

     1	[main]
     2	gpgcheck=1
     3	installonly_limit=3
     4	clean_requirements_on_remove=True
     5	best=True
     6	skip_if_unavailable=False
     7	proxy=http://10.0.1.254:3128

cat は短い設定ファイルの確認に便利です。ただし、数百行を超えるファイルに cat を使うと画面が一瞬で流れてしまい、読めません。長いファイルには次に紹介する less を使います。

ページ送りで見る(less)

less は、長いファイルをページ単位で読むためのコマンドです。先ほど man コマンドの操作で使ったキー操作がそのまま使えます。

実行コマンド:

$ less /etc/dnf/dnf.conf

表示されたら、スペースキーで次のページ、b で前のページ、q で終了です。/ に続けて文字を入力すると、ファイル内を検索できます。

catless の使い分けは明快です。数行~数十行程度の短いファイルは cat、それ以上は less と覚えておいてください。

先頭・末尾だけ見る(head, tail)

head はファイルの先頭、tail はファイルの末尾を表示します。デフォルトではそれぞれ10行が表示されます。

実行コマンド:

$ head -5 /etc/passwd

実行結果:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

-5 は「先頭5行を表示する」という意味です。-n 5 と書いても同じ結果になります。

実行コマンド:

$ tail -3 /etc/passwd

実行結果:

chrony:x:996:996:chrony system user:/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/usr/sbin/nologin
developer:x:1000:1000:developer:/home/developer:/bin/bash

末尾の3行が表示されました。最後のユーザーとして developer(普段使っているアカウント)が見えます。

tail にはもう1つ重要な使い方があります。-f(follow)オプションを使うと、ファイルに追記された内容をリアルタイムで表示し続けます。ログファイルの監視に使う定番のテクニックですが、本格的なログ監視は第23回で扱うため、ここでは「tail -f でログをリアルタイムに追いかけられる」とだけ覚えておいてください。

行数・単語数を数える(wc)

wc(word count)はファイルの行数・単語数・バイト数を表示します。

実行コマンド:

$ wc /etc/passwd

実行結果:

  21   39 1001 /etc/passwd

左から順に「行数」「単語数」「バイト数」「ファイル名」です。/etc/passwd は21行あることがわかります。

行数だけを知りたい場合は -l(line)オプションを使います。

実行コマンド:

$ wc -l /etc/passwd

実行結果:

21 /etc/passwd

「このサーバーにユーザーは何人いるか」を素早く確認したいとき、wc -l /etc/passwd で行数を数えるのは現場でよく使うテクニックです(厳密にはシステムアカウントも含む行数ですが、目安として有用です)。

ディレクトリ構造を見渡す(tree)

冒頭でインストールした tree コマンドを使ってみます。tree はディレクトリ構造をツリー形式で表示します。

実行コマンド:

$ tree practice

実行結果:

practice
├── file1.txt
├── renamed.txt
├── sample.txt
└── sub1
    └── file3.txt

1 directory, 4 files

前回の記事で ls を使ってディレクトリの中身を確認しましたが、tree はサブディレクトリの中身まで一度に見渡せるのが利点です。特にディレクトリ階層が深い場合に役立ちます。

表示する深さを制限したい場合は -L オプションでレベルを指定します。

実行コマンド:

$ tree -L 1 /etc

これで /etc 直下のディレクトリとファイルだけが表示されます。-L 2 にすると2階層目まで表示されます。システムディレクトリのように中身が多い場所では、-L で深さを制限するのが定番の使い方です。

ファイルを探す(find, xargs)

find は、指定した条件に合うファイルやディレクトリを検索するコマンドです。書式は find 検索開始ディレクトリ 条件 です。

名前で検索する例として、/etc 配下で .conf で終わるファイルを探してみます。

実行コマンド:

$ find /etc -name "*.conf" | head -10

実行結果:

/etc/lvm/lvm.conf
/etc/lvm/lvmlocal.conf
/etc/resolv.conf
/etc/dnf/plugins/copr.conf
/etc/dnf/plugins/debuginfo-install.conf
/etc/dnf/protected.d/dnf.conf
/etc/dnf/protected.d/setup.conf
/etc/dnf/protected.d/systemd.conf
/etc/dnf/protected.d/grub2-tools-minimal.conf
/etc/dnf/protected.d/grub2-efi-x64.conf

-name "*.conf" は「名前が .conf で終わるもの」を意味します。* は任意の文字列に一致するワイルドカードです。"*.conf" をクォーテーションで囲んでいるのは、シェルが * を勝手に展開しないようにするためです。

| head -10 は「出力の先頭10行だけを表示する」という意味です。|(パイプ)はコマンドの出力を次のコマンドに渡す仕組みで、詳しくは第8回で学びます。ここでは「結果が多すぎるときに件数を絞る手段」として使っています。

find でよく使う条件をいくつか紹介します。

  • -name "パターン": ファイル名で検索(大文字小文字を区別する)
  • -iname "パターン": ファイル名で検索(大文字小文字を区別しない)
  • -type f: ファイルのみ検索
  • -type d: ディレクトリのみ検索
  • -mtime -7: 7日以内に更新されたものを検索
  • -size +10M: 10MBより大きいファイルを検索

練習用ディレクトリで種類を絞った検索も試してみます。

実行コマンド:

$ find practice -type f

実行結果:

practice/sub1/file3.txt
practice/file1.txt
practice/sample.txt
practice/renamed.txt

-type f でファイルだけに絞り込まれ、ディレクトリ(sub1)は結果に含まれません。

find の検索結果に対して別のコマンドを実行したい場合、xargs を使います。xargs は、前のコマンドの出力を引数として次のコマンドに渡す仕組みです。

たとえば、practice 配下のすべての .txt ファイルの行数を数えるには、以下のように書きます。

実行コマンド:

$ find practice -name "*.txt" | xargs wc -l

実行結果:

  0 practice/sub1/file3.txt
  0 practice/file1.txt
  1 practice/sample.txt
  0 practice/renamed.txt
  1 合計

find が見つけたファイルのパスが、xargs を通じて wc -l に渡され、各ファイルの行数が表示されました。findxargs の組み合わせは、「条件に合うファイルを探して、それに対して何かを実行する」という作業で頻繁に使われます。

find には、ここで紹介した以外にも多くのオプションがあります。「こういう条件で探せないかな」と思ったら、man find で確認してみてください。すべてを覚える必要はなく、必要なときに調べられることが大切です。

ファイルをまとめる・圧縮する(tar, gzip)

サーバー運用では、複数のファイルを1つにまとめて保管したり、他のサーバーに転送したりする場面がよくあります。そのために使うのが tar(アーカイブ)と gzip(圧縮)です。

この2つは役割が異なります。

  • tar: 複数のファイルやディレクトリを1つのファイル(アーカイブ)にまとめる。サイズは小さくならない
  • gzip: ファイルを圧縮してサイズを小さくする。1つのファイルしか圧縮できない

「複数のファイルをまとめて圧縮する」には、tar で1つにまとめてから gzip で圧縮する、という2段階の処理が必要です。ただし、tar コマンドには gzip を同時に呼び出すオプション(-z)があるため、実際には1コマンドで済みます。

まず、practice ディレクトリをアーカイブ+圧縮してみます。

実行コマンド:

$ tar czf practice.tar.gz practice

オプションの意味は以下のとおりです。

  • c(create): アーカイブを作成する
  • z: gzipで圧縮する
  • f(file): 出力先のファイル名を指定する(f の直後にファイル名を書く)

作成されたファイルを確認します。

実行コマンド:

$ ls -lh practice.tar.gz

実行結果:

-rw-r--r--. 1 developer developer 247  3月 29 10:05 practice.tar.gz

圧縮ファイルの拡張子は .tar.gz です。.tar(アーカイブ)を .gz(gzip圧縮)したものであることを示しています。.tgz と書かれることもあり、意味は同じです。

次に、中身を確認(展開せずに一覧表示)してみます。

実行コマンド:

$ tar tzf practice.tar.gz

実行結果:

practice/
practice/sub1/
practice/sub1/file3.txt
practice/file1.txt
practice/sample.txt
practice/renamed.txt

t(list)は中身の一覧を表示するオプションです。展開する前に「このアーカイブには何が入っているか」を確認するのは、良い習慣です。

展開(解凍)するには x(extract)を使います。別の場所に展開して試してみます。

実行コマンド:

$ mkdir restore_test

実行コマンド:

$ tar xzf practice.tar.gz -C restore_test

実行コマンド:

$ tree restore_test

実行結果:

restore_test
└── practice
    ├── file1.txt
    ├── renamed.txt
    ├── sample.txt
    └── sub1
        └── file3.txt

2 directories, 4 files

-C は展開先のディレクトリを指定するオプションです。元の practice と同じ構造が restore_test の中に復元されています。

tar のオプションをまとめます。

操作コマンド覚え方
アーカイブ+圧縮tar czf ファイル名.tar.gz 対象create(作成)
一覧表示tar tzf ファイル名.tar.gztable of contents(目次)
展開tar xzf ファイル名.tar.gzextract(抽出)

tar のオプションは数が多いため、すべてを覚える必要はありません。ctx の3つを押さえておけば日常業務は十分です。それ以外のオプションが必要になったときは、man tar で調べれば大丈夫です。

tar はバックアップ作業で頻繁に使います。第31回「バックアップと復旧」で改めて実践的な使い方を学びます。

やってみよう — 総合演習

ここまで学んだコマンドを使って、以下の演習に取り組んでください。回答は1つの正解に限りません。自分なりにコマンドを組み立てて試してみてください。

演習1: ディレクトリ構造の構築

以下のディレクトリ構造をコマンドで作成してください。

project/
├── docs/
├── logs/
└── scripts/

ヒント: mkdir は複数のディレクトリ名をスペースで区切って一度に指定できます。

演習2: ファイルの作成と移動

  1. project/docs/readme.txtmanual.txt を作成する
  2. manual.txtproject/docs/ から project/scripts/ に移動する
  3. project/ 全体をコピーして project_backup/ を作成する
  4. tree コマンドで両方の構造を確認する

演習3: ファイルの検索と確認

  1. find/etc 配下にある .conf ファイルのうち、7日以内に更新されたものを検索する
  2. /etc/passwd の先頭3行と末尾3行を表示する
  3. /etc/passwd の行数を wc で確認する

ヒント: find の条件は複数同時に指定できます。-name "*.conf" -mtime -7 のように並べてください。

演習4: アーカイブと復元

  1. project/project.tar.gz として圧縮する
  2. 中身を一覧表示して、意図したファイルが含まれているか確認する
  3. /tmp に展開して、元と同じ構造が復元されることを確かめる

演習5: manでコマンドを調べてみよう

  1. man cp を開いて、-i オプションの意味を調べてみてください
  2. man find を開いて、-maxdepth オプションの意味を調べてみてください

ヒント: マニュアル内で / に続けて検索語を入力すると検索できます。たとえば /-i と入力してEnterを押すと、-i を含む箇所にジャンプします。n で次の検索結果に移動できます。

後片付け

演習で作成したファイルやディレクトリを削除して、ホームディレクトリを元の状態に戻しておきます。

実行コマンド:

$ rm -r practice practice.tar.gz restore_test project project_backup project.tar.gz

実行コマンド:

$ ls

何も表示されなければ(隠しファイルを除く)、後片付けは完了です。

理解度チェック

以下の文が正しければ○、間違っていれば×と答えてください。

  1. mkdir -p a/b/c を実行すると、途中のディレクトリ ab も同時に作成される
  2. cp でディレクトリをコピーするときは -r オプションが必要である
  3. rm で削除したファイルは、Windowsのゴミ箱のように復元できる
  4. cat は長いファイルの閲覧に適したコマンドである
  5. tar czf は、ファイルのアーカイブと圧縮を同時に行う
  6. dnf install コマンドでパッケージをインストールするには、sudo(管理者権限)が必要である
  7. man コマンドは、そのサーバーにインストールされているバージョンに対応したマニュアルを表示する
  8. find コマンドで -name "*.conf" を指定すると、名前が .conf で終わるファイルだけを検索できる
解答
  1. ○ ―― -p オプションにより、途中の階層のディレクトリがなければ自動的に作成される
  2. ○ ―― -r(recursive)を付けないと、ディレクトリのコピーはエラーになる
  3. × ―― Linuxにはゴミ箱の仕組みがなく、rm で削除したファイルは基本的に復元できない
  4. × ―― cat は短いファイルに向いている。長いファイルには less を使う
  5. ○ ―― c がアーカイブ作成、z がgzip圧縮、f が出力ファイル名の指定
  6. ○ ―― パッケージのインストールはシステム全体に影響するため、管理者権限が必要
  7. ○ ―― Web検索と異なり、実際のバージョンに対応した正確な情報が得られる
  8. ○ ―― * は任意の文字列にマッチするワイルドカード

まとめ

今回は、Linuxのファイル操作に必要な基本コマンドを学びました。

  • dnf install でパッケージを追加インストールする方法を体験した。管理者権限が必要な操作には sudo を付ける
  • man コマンドでマニュアルを参照する習慣を身につけた。オプションを忘れたら man コマンド名
  • mkdirtouchcpmvrm でファイルとディレクトリの作成・コピー・移動・削除ができる
  • catlessheadtailwc でファイルの中身を確認・集計できる
  • tree でディレクトリ構造を一覧表示し、find で条件に合うファイルを検索できる
  • tar czf でアーカイブ+圧縮、tar xzf で展開。中身の事前確認は tar tzf
  • rm -rf は取り消しが利かないため、実行前にパスの確認を徹底する

次回の第8回「基本コマンド(テキスト処理・パイプとリダイレクト)」では、今回は軽く触れただけのパイプ(|)やリダイレクト(>)の仕組みを本格的に学びます。grepsedawk といったテキスト処理コマンドも登場します。

前の記事
次の記事