LPIC Level1 復習ラジオ 09:ファイル操作コマンド
音声
目次
ファイル操作の基本
Linuxでは、通常ファイル、ディレクトリ、シンボリックリンクなどを、コマンドラインから作成・コピー・移動・削除できます。
今回扱うコマンドは、次の七つです。
| コマンド | 主な役割 |
|---|---|
ls | ファイルやディレクトリの情報を一覧表示する |
cp | ファイルやディレクトリをコピーする |
mv | ファイルやディレクトリを移動・改名する |
rm | ファイルやディレクトリを削除する |
mkdir | ディレクトリを作成する |
touch | タイムスタンプを変更し、存在しなければ空ファイルを作成する |
ln | ハードリンクまたはシンボリックリンクを作成する |
パスと安全な指定
絶対パスと相対パス
絶対パスは、ルートディレクトリの/から始まるパスです。相対パスは、現在の作業ディレクトリを基準にしたパスです。
/home/alice/report.txt
./report.txt
../backup/report.txt
.:現在のディレクトリ..:一つ上の親ディレクトリ~:シェルによって展開される、現在のユーザーのホームディレクトリ
空白を含む名前
空白を含むファイル名は、引用符で囲むか、空白をバックスラッシュでエスケープします。
cp "monthly report.txt" backup/
cp monthly\ report.txt backup/
ハイフンで始まる名前
-fileのような名前は、コマンドのオプションと解釈される可能性があります。--でオプションの終わりを示すか、./を付けます。
rm -- -file
rm ./-file
操作前の確認
pwd
ls -ld -- 対象
printf '%s\n' -- 対象
特に削除や上書きの前には、pwdで現在地を確認し、対象をlsで表示してから実行します。
ls
lsは、ファイルやディレクトリの情報を一覧表示するコマンドです。
ls
ls /etc
ls file1 file2
引数を指定しない場合は、現在のディレクトリの内容を表示します。通常、名前がドットで始まる隠しファイルは表示しません。
よく使うオプション
ls -l
ls -a
ls -A
ls -h
ls -lh
ls -ld directory
ls -lt
ls -ltr
ls -R
| オプション | 意味 |
|---|---|
-l | パーミッション、リンク数、所有者、グループ、サイズ、時刻などを長い形式で表示する |
-a | .と..を含む、ドットで始まる項目も表示する |
-A | .と..を除き、ドットで始まる項目を表示する |
-h | サイズをKiB、MiBなど読みやすい単位で表示する。通常は-lと組み合わせる |
-d | ディレクトリの中身ではなく、ディレクトリ自身の情報を表示する |
-t | 更新時刻を基準に並べ替える |
-r | 並び順を逆にする |
-R | サブディレクトリを再帰的に表示する |
-i | inode番号を表示する |
ls -lの見方
-rw-r----- 1 alice developers 2048 Jul 11 10:00 report.txt
lrwxrwxrwx 1 alice developers 10 Jul 11 10:10 latest -> report.txt
先頭文字はファイルの種類です。-は通常ファイル、dはディレクトリ、lはシンボリックリンクを表します。
シンボリックリンクでは、通常、リンク名 -> リンク先が表示されます。
cp
cpは、ファイルまたはディレクトリをコピーします。通常のコピーでは、コピー先は元ファイルから独立した別のファイルになります。
基本形
cp source.txt destination.txt
cp source.txt backup/
cp file1 file2 backup/
二つのファイル名を指定すると、一つ目を二つ目へコピーします。最後の引数が既存ディレクトリの場合は、そのディレクトリ内へ元と同じ名前でコピーします。
ディレクトリのコピー
cp -R source_dir backup/
cp -a source_dir backup/
-Rまたは-r:ディレクトリを再帰的にコピーする-a:再帰コピーし、シンボリックリンクや属性などを可能な限り保持するアーカイブモード
バックアップや構成の複製では、単なる-Rよりも属性保持を含む-aが適する場合があります。
上書きと属性
cp -i source.txt destination.txt
cp -n source.txt destination.txt
cp -p source.txt destination.txt
cp -v source.txt backup/
cp --backup source.txt destination.txt
| オプション | 意味 |
|---|---|
-i | 既存ファイルを上書きする前に確認する |
-n | 既存ファイルを上書きせずスキップする。GNU Coreutilsでは移植性上の注意がある |
-p | モード、所有者、タイムスタンプなど、指定された属性を保持する |
-v | 処理したファイル名を表示する |
--backup | 上書き対象のバックアップを作成する |
末尾スラッシュで迷わない
コピー先に同名ディレクトリが存在するかどうかで、出来上がる階層が変わる場合があります。実行前後にls -ldやfindで確認します。
cp -a project backup/
ls -ld backup backup/project
mv
mvは、ファイルやディレクトリを移動します。同じ場所で名前を変える場合は、改名コマンドとして使えます。
改名と移動
mv old.txt new.txt
mv report.txt archive/
mv file1 file2 archive/
同じファイルシステム内の移動では、ディレクトリエントリの付け替えで完了することが多く、内容全体をコピーするより高速です。
異なるファイルシステム間では、実質的にコピーしてから元を削除する処理になることがあります。この場合は、容量や処理時間にも注意します。
上書きへの対応
mv -i old.txt new.txt
mv -n old.txt new.txt
mv -v old.txt archive/
mv --backup old.txt new.txt
-i:上書き前に確認する-n:既存の宛先を上書きしない-v:実行した処理を表示する--backup:上書きされる宛先のバックアップを作る
mvは元の場所から項目がなくなるため、コピーとは異なります。保険として元を残したい場合は、先にcpで複製し、確認後に削除します。
rm
rmは、指定したファイルを削除します。標準ではディレクトリを削除しません。
rm file.txt
rm file1 file2
rm -i file.txt
rm -I *.log
rm -v file.txt
| オプション | 意味 |
|---|---|
-i | 各ファイルを削除する前に確認する |
-I | 多数のファイルや再帰削除のとき、全体について一度確認する |
-f | 存在しないファイルを無視し、確認を行わない |
-r、-R | ディレクトリとその中身を再帰的に削除する |
-v | 削除するファイル名を表示する |
ディレクトリの削除
rmdir empty_dir
rm -r directory
rm -rI directory
rmdirは空のディレクトリだけを削除します。中身を含めて削除する場合はrm -rを使います。
rm -rfの注意
rm -rfは、再帰的な削除を確認なしで進めます。ワイルドカード、変数、カレントディレクトリの勘違いがあると、意図しない範囲を消す可能性があります。
pwd
ls -ld -- directory
find directory -maxdepth 2 -print
rm -rI -- directory
いきなり-fを付けず、対象を表示し、可能なら-Iで全体確認を入れます。
一般的なrmは、ごみ箱へ移動する操作ではありません。バックアップやスナップショットがなければ、簡単には元へ戻せません。
mkdir
mkdirは、指定した名前のディレクトリを作成します。
mkdir reports
mkdir dir1 dir2 dir3
親ディレクトリもまとめて作成
mkdir -p project/log/archive
mkdir -pv project/{bin,etc,var}
-p:不足している親ディレクトリも作成し、すでに存在するディレクトリをエラーにしない-v:作成したディレクトリを表示する-m:作成するディレクトリのモードを指定する
mkdir -m 750 private_dir
mkdir -p -m 750 parent/child
-mは、コマンドラインで直接指定したディレクトリのモードに影響します。-pによって途中に作られた親ディレクトリへ同じモードが必ず適用されるわけではありません。
新規ディレクトリの最終的な権限には、umaskやACLも関係します。
touch
touchの本来の役割は、ファイルのアクセス時刻や更新時刻を変更することです。指定したファイルが存在しない場合、標準では空のファイルを作成します。
touch memo.txt
touch file1 file2
touch existing.txt
existing.txtが存在する場合、内容は空にならず、標準ではアクセス時刻と更新時刻が現在時刻へ変更されます。
よく使うオプション
touch -a file.txt
touch -m file.txt
touch -c missing.txt
touch -d "2026-07-01 09:00" file.txt
touch -r reference.txt target.txt
| オプション | 意味 |
|---|---|
-a | アクセス時刻だけを変更する |
-m | 更新時刻だけを変更する |
-c | 存在しないファイルを新規作成しない |
-d | 文字列で指定した日時を使う |
-r | 参照ファイルの時刻を使う |
touchでは、ctimeと呼ばれる状態変更時刻を任意の値へ設定できません。また、ファイルシステムが対応していても、作成時刻を任意に変更する用途のコマンドではありません。
stat file.txt
時刻の違いを確認する場合は、statを使うと、アクセス時刻、更新時刻、状態変更時刻などを詳しく確認できます。
ln
lnは、ファイルへ別の名前を付けるリンクを作成します。リンクには、ハードリンクとシンボリックリンクがあります。
ハードリンク
ln original.txt hardlink.txt
ls -li original.txt hardlink.txt
ハードリンクは、既存ファイルと同じinodeを参照する、もう一つのファイル名です。元の名前とハードリンクのどちらが本体という区別はありません。
一つの名前を削除しても、同じinodeを指す別のハードリンクが残り、開いているプロセスなどの参照もなくなるまでは、ファイル内容は解放されません。
通常、ハードリンクは別のファイルシステムを越えて作成できません。また、多くのシステムでは一般ユーザーがディレクトリのハードリンクを作成できません。
シンボリックリンク
ln -s /opt/app/current app
ls -l app
readlink app
readlink -f app
シンボリックリンクは、リンク先のパス名を保持する特別なファイルです。別ファイルシステムやディレクトリもリンク先にできます。
リンク先が削除・移動されると、リンクだけが残り、参照できない壊れたリンクになることがあります。
相対リンクと絶対リンク
ln -s ../shared/config.ini config.ini
ln -s /srv/shared/config.ini config.ini
相対パスのシンボリックリンクは、リンクが置かれているディレクトリを基準に解釈されます。コマンドを実行したカレントディレクトリが基準ではありません。
上書きへの対応
ln -s target linkname
ln -sf target linkname
ln -sfn target directory_link
-fは既存の宛先を削除して作り直します。-nは、宛先がディレクトリへのシンボリックリンクの場合に、そのリンク自体を通常ファイルのように扱うために使われます。
リンク更新では、リンク先とリンク名の順番を逆にしやすいため、ln -s リンク先 リンク名と覚えます。
| 項目 | ハードリンク | シンボリックリンク |
|---|---|---|
| 参照するもの | 同じinode | リンク先のパス名 |
| 別ファイルシステム | 通常不可 | 可能 |
| ディレクトリへのリンク | 通常不可 | 可能 |
| リンク先削除後 | 他のハードリンクから内容へアクセス可能 | 壊れたリンクになる |
| 確認方法 | ls -li | ls -l、readlink |
実践的な確認手順
ファイル操作で事故を減らすため、実行前・実行時・実行後の三段階で確認します。
実行前
pwd
ls -ld -- source destination
stat -- source
df -h -- source destination
- 現在のディレクトリは正しいか
- 対象は通常ファイル、ディレクトリ、シンボリックリンクのどれか
- コピー先や移動先に同名の項目がないか
- 別ファイルシステムをまたぐ処理か
実行時
cp -iv source destination
mv -iv source destination
rm -rI directory
mkdir -pv path/to/directory
最初は-i、-I、-vなどを使い、確認と表示を増やします。
実行後
ls -l
ls -li
stat destination
readlink -f symbolic_link
ファイルの存在だけでなく、所有者、パーミッション、サイズ、時刻、inode、リンク先も必要に応じて確認します。
よくある間違い
ls -l directoryで、ディレクトリ自身ではなく中身を見ているcpやmvで、既存ファイルを意図せず上書きするrm -rfへ、空の変数や想定外に展開されたワイルドカードを渡すtouchは既存ファイルの内容を空にすると誤解するln -sで、リンク先とリンク名の順番を逆にする- 相対シンボリックリンクを、リンクの設置場所ではなく現在地基準で考える
詳しい使い方は、次のマニュアルでも確認できます。
man ls
man cp
man mv
man rm
man mkdir
man touch
man ln
man stat
man readlink
30秒チェック
- ディレクトリ自身の情報を長い形式で表示するコマンドは何でしょうか。
- 属性を可能な限り保持しながらディレクトリを再帰コピーする、GNU
cpの代表的なオプションは何でしょうか。 rm -rとrm -fは、それぞれ何を意味するでしょうか。touchで既存ファイルを指定すると、標準では内容はどうなるでしょうか。- ハードリンクが同じであることを確認しやすい、
lsのオプションは何でしょうか。 - シンボリックリンクの相対パスは、どの場所を基準に解釈されるでしょうか。
答えを表示
ls -ld ディレクトリ-a、つまりcp -a-rは再帰処理、-fは確認せず強制的に処理する指定- 内容は変更せず、標準ではアクセス時刻と更新時刻を現在時刻へ変更する
-i、つまりls -li- シンボリックリンクが置かれているディレクトリ
要約
lsは一覧表示、ls -ldはディレクトリ自身の情報確認に使います。cpは独立したコピーを作り、ディレクトリには-R、属性保持を含む複製には-aを使います。mvは移動と改名に使い、元の場所から項目がなくなります。rmは削除を行い、-rは再帰、-fは確認なしの強制処理です。mkdir -pは、不足する親ディレクトリもまとめて作成します。touchはタイムスタンプを変更し、存在しない場合は標準で空ファイルを作ります。- ハードリンクは同じinodeへの別名で、シンボリックリンクはリンク先のパス名を保持します。
- 空白やハイフンを含む名前は、引用符、
--、./を使って安全に指定します。 - 上書きや削除では、
-i、-I、-vを使って確認を増やします。 - 実行前に
pwdとls、実行後にstatやreadlinkで結果を確認します。
参考資料
- GNU Coreutils:ls invocation
- GNU Coreutils:What information is listed
- GNU Coreutils:cp invocation
- GNU Coreutils:mv invocation
- GNU Coreutils:rm invocation
- GNU Coreutils:mkdir invocation
- GNU Coreutils:touch invocation
- GNU Coreutils:ln invocation
- GNU Coreutils:stat invocation
- GNU Coreutils:readlink invocation
- inode(7) manual page
- symlink(7) manual page