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

コピーする:cp

cpはファイルやディレクトリをコピーするコマンドです。

主なオプション効果
-r(または-R)ディレクトリを再帰的にコピーする(ディレクトリ自体を指定する場合は必須)
-iコピー先に同名のファイルがある場合、上書きの前に確認する
-pパーミッション・所有者・タイムスタンプを可能な範囲で維持したままコピーする(所有者の維持には適切な権限が必要)
-a-pを含む属性保持とシンボリックリンクの扱いなどをまとめて指定する「アーカイブモード」
-uコピー先に同名ファイルが存在しない場合はコピーし、存在する場合はコピー元の方が新しいときだけ上書する
-v処理内容を表示する
cp file1.txt file2.txt          # ファイルを1つコピーする
cp -r srcdir/ destdir/          # ディレクトリを再帰的にコピーする
cp -a original/ backup/         # 属性を維持したままディレクトリをコピーする

移動・名前変更する:mv

mvはファイルやディレクトリを移動、または名前を変更するコマンドです。コピーと異なり元のファイルは残りません。ディレクトリの再帰コピーとは違い、mvには再帰オプションは不要です(ディレクトリ自体を1つの単位として移動するため)。

mv oldname.txt newname.txt      # 名前を変更する
mv file.txt /tmp/               # 別のディレクトリへ移動する

削除する:rm、rmdir

rmはファイルを削除するコマンドです。

主なオプション効果
-r(または-R)ディレクトリを再帰的に削除する
-i削除の前に確認する
-f存在しないファイルを無視し、確認も行わずに削除する
-v処理内容を表示する
rm file.txt          # ファイルを1つ削除する
rm -rf olddir/       # ディレクトリを中身ごと確認無しで再帰的に削除する

rmdirは空のディレクトリのみを削除する専用コマンドです。中身が残っている場合は削除に失敗するため、「空であることを確認してから削除したい」場面でrm -rより安全に使えます。

作成する:mkdir、touch

mkdirはディレクトリを作成します。-pオプションを付けると、途中に存在しない親ディレクトリもまとめて作成できます。

mkdir -p projects/2026/reports    # 親ディレクトリごと作成する

touchは、指定したファイルが存在しない場合は空のファイルを新規作成し、既に存在する場合はそのファイルのアクセス時刻と更新時刻を現在時刻に更新します。

一覧表示する:ls

lsはディレクトリの内容を一覧表示するコマンドです。-l(詳細表示)、-a(隠しファイルを含む)、-h(サイズを人間に読みやすい単位で表示)などのオプションと組み合わせてよく使われます。

ワイルドカード(ファイルグロビング)

シェルは、コマンドの引数にワイルドカードを含む文字列があると、それを実際に一致するファイル名の一覧に展開してからコマンドに渡します。この仕組みをファイルグロビングと呼びます。

記号意味
*任意の文字列(0文字以上)に一致する
?任意の1文字に一致する
[abc]角括弧内のいずれか1文字に一致する
[a-z]範囲内のいずれか1文字に一致する
[!abc]角括弧内の文字以外の1文字に一致する

一部のシェルでは[^abc]も否定文字クラスとして使えますが、基本的な記法は[!abc]です。

通常、パターンの先頭が.でない場合、これらのワイルドカードは名前が.で始まる隠しファイルには一致せず、ディレクトリ区切り文字をまたいで一致することもありません。

ls *.txt          # 拡張子が.txtのファイルすべて
ls file?.log      # file1.log、fileA.logなどに一致(file10.logには一致しない)
ls file[123].txt  # file1.txt、file2.txt、file3.txtに一致

ワイルドカードは正規表現とは記法が異なる点に注意してください(例:*の意味が正規表現とグロブでは異なります)。

ファイルを検索する:find

findは、指定したディレクトリ以下を再帰的にたどり、名前・種類・サイズ・更新日時などの条件に一致するファイルを検索するコマンドです。

主な条件式効果
-name パターンファイル名がグロブパターンに一致するものを検索する。シェルによる展開を防ぐため、パターンは通常引用符で囲む
-iname パターン-nameの大文字小文字を区別しない版
-type 種類ファイルの種類で絞り込む(f=通常ファイル、d=ディレクトリ、l=シンボリックリンク)
-size 値ファイルサイズで絞り込む(例:+100Mで100MiB超、-10kで10KiB未満)。サイズは指定単位で切り上げて評価される
-mtime n更新日時を24時間単位で切り捨てた値で絞り込む(+7で8日以上前、-1で24時間以内)
-newer 参照ファイル参照ファイルより新しく更新されたファイルを検索する
-perm モードパーミッションで絞り込む。-perm 644は完全一致、-perm -644は指定したすべてのビットが設定されているもの、-perm /222は指定したいずれかのビットが設定されているものを検索する
-notもしくは!条件の否定

-permによるパーミッション検索

-permでは、通常の読み取り・書き込み・実行権限だけでなく、SUID、SGID、スティッキービットなどの特殊なパーミッションも検索できます。

指定形式意味
-perm モードパーミッションがモードと完全に一致する
-perm -モードモードで指定したすべてのビットが設定されている
-perm /モードモードで指定したビットのうち、いずれか1つ以上が設定されている

たとえば、-perm -4000はSUIDビットが設定されているファイルを検索します。先頭の-はfindの条件式の一部であり、「指定したビットがすべて設定されている」という意味です。

find /var/log -name "*.log"          # 名前で検索する
find / -type f -size +100M           # 100MiBを超える通常ファイルを検索する
find /tmp -mtime +7                  # 8日以上前に更新されたファイルを検索する
find /data -not -user userA          # 所有者がuserA以外のファイル・ディレクトリを検索する

find . -type f -perm 644             # パーミッションが644と完全に一致する通常ファイル
find . -type f -perm -600            # 所有者の読み取り権限と書き込み権限が両方設定された通常ファイル
find . -type f -perm /222            # いずれかの書き込み権限が設定された通常ファイル
find / -type f -perm -4000           # SUIDビットが設定された通常ファイル
find / -type f -perm /6000           # SUIDまたはSGIDのいずれかが設定された通常ファイル

なお、以前は「いずれかのビット」を表すために-perm +モードという形式も使われていましたが、現在のGNU findでは非推奨または未対応です。-perm /モードを使用します。

検索結果に対してコマンドを実行する:-exec

-execアクションを使うと、検索でヒットした各ファイルに対してコマンドを実行できます。{}が一致したファイル名に置き換えられます。

記法効果
-exec コマンド {} \;ヒットしたファイル1つごとにコマンドを1回ずつ実行する
-exec コマンド {} +複数のファイル名をまとめて1回(または少ない回数)のコマンド実行に渡す(xargsに近い動作で効率的)
find . -type f -name "*.tmp" -exec rm {} \;     # .tmpファイルを1つずつ削除する
find . -type f -name "*.log" -exec gzip {} +    # .logファイルをまとめてgzip圧縮する

アーカイブとコピー:tar、cpio、dd

tar:複数ファイルを1つのアーカイブにまとめる

tar(tape archive)は、複数のファイルやディレクトリを1つのアーカイブファイルにまとめたり、展開したりするコマンドです。

モード効果
-c新しいアーカイブを作成する
-xアーカイブからファイルを展開する
-tアーカイブの内容を一覧表示する(展開はしない)
修飾オプション効果
-v処理したファイル名を表示する(詳細表示)
-f ファイル名対象とするアーカイブファイルを指定する
-zgzip形式で圧縮・展開する(.tar.gz)
-jbzip2形式で圧縮・展開する(.tar.bz2)
tar -cvzf backup.tar.gz -C / etc/    # /etc/をgzip圧縮しつつアーカイブ作成
tar -xvzf backup.tar.gz             # 展開する
tar -tvzf backup.tar.gz             # 中身を一覧表示する(展開しない)

cpio:標準入力のファイル一覧からアーカイブを作成する

cpioは、アーカイブ作成時やcopy-passモードではfindなどが出力するファイル名の一覧を標準入力から受け取り、それらをアーカイブ化・コピーするコマンドです。アーカイブの展開時には、標準入力からアーカイブを受け取ります。tarと異なり、アーカイブ作成時の対象ファイル一覧を通常はfindなどから標準入力で受け取る点が特徴です。

モード効果
-o(copy-out)標準入力のファイル名一覧からアーカイブを作成する
-i(copy-in)アーカイブからファイルを展開する
-p(copy-pass)アーカイブを経由せず、ファイルを別のディレクトリへ直接コピーする。コピー先ディレクトリを最後の引数に指定する
find . -depth -print | cpio -o > archive.cpio    # findの出力からアーカイブを作成する
cpio -id < archive.cpio                          # アーカイブを展開する

dd:ブロック単位でデータを複製する

ddは、ファイルやデバイスの内容をブロック単位でそのまま複製するコマンドです。ディスクイメージの作成やデバイス間の低レベルなコピーによく使われます。

主なオペランド効果
if=ファイル入力元を指定する(既定は標準入力)
of=ファイル出力先を指定する(既定は標準出力)
bs=バイト数1回の読み書きの単位となるブロックサイズを指定する(既定512バイト)
count=個数コピーするブロックの個数を指定する
dd if=/dev/sda of=disk.img bs=4M count=100    # ディスクの先頭400MiB分をイメージファイルに複製する

ddは通常ファイルに加え、ブロックデバイスも入出力の対象に指定できます。ブロックデバイスを指定した場合はファイルシステムを介さずに内容を読み書きでき、パーティション全体やディスク全体の複製・バックアップに使われます。誤ったデバイスを指定すると既存のデータを破壊してしまう点に注意が必要です。

ファイルの種類を調べる:file

fileは、拡張子ではなくファイルの内容(先頭バイト列に含まれる「マジックナンバー」等)を調べて、そのファイルの種類を判定するコマンドです。拡張子を偽装したファイルや、拡張子の付いていないファイルでも種類を判定できる場合があります。

file document.txt
# document.txt: ASCII text

file archive.tar.gz
# archive.tar.gz: gzip compressed data

圧縮・展開:gzip、gunzip、bzip2、bunzip2

コマンド役割
gzip ファイルファイルをgzip形式(.gz)で圧縮する(元のファイルは削除され、.gzが付いたファイルに置き換わる)
gunzip ファイル.gzgzip形式のファイルを展開する(gzip -dと同等)
bzip2 ファイルファイルをbzip2形式(.bz2)で圧縮する
bunzip2 ファイル.bz2bzip2形式のファイルを展開する
gzipの主なオプション効果
-d展開する(gunzipと同等)
-k圧縮・展開後も元のファイルを残す(既定では削除される)
-1〜-9圧縮率を指定する(-1は高速・低圧縮率、-9は低速・高圧縮率。既定は-6)
gzip -k report.log        # 元ファイルを残したまま圧縮する
gunzip report.log.gz      # 展開する

glob(ワイルドカード)によるパス名展開

globとは、シェルがメタキャラクタを使って複数のファイル名・ディレクトリ名を展開する仕組みです。

パターン意味例
*0文字以上の任意の文字列ls *.txt:拡張子が.txtのファイルを一覧表示
?任意の1文字ls file?.txt:file1.txtなどに一致
[abc][]内のいずれか1文字ls file[123].txt:file1.txt~file3.txtに一致
[a-z]指定した範囲の1文字ls [a-z]*:英小文字で始まる名前に一致

cp *.conf backup/のように、展開結果をコマンドの複数の引数として渡せます。
通常、*は.bashrcなどの.で始まる隠しファイルには一致しないため、.[!.]*などを使います。