警告

本資料は参考情報として提供されています。内容についてのご質問には必ずしもお答えできない可能性がございます。

2. ファイルの操作

Linuxにおけるファイルの管理とそれに使うコマンドについて記述します。

2.1. ファイルツリー

Linuxでは、全てのファイルがいずれかのディレクトリ(=フォルダ)に格納されています。ディレクトリが入っているディレクトリをたどっていくと、必ず1つのディレクトリにたどり着きます。これをルートディレクトリと呼びます。

あるファイルやディレクトリの所属は、ルートディレクトリを根とする木構造で表すことができます。これはファイルツリーと呼ばれます。

📁 /
├─ 📁 bin/
├─ 📁 etc/
├─ 📁 home/
│   └─ 📁 project/
│       └─ 📁 personal-id/
│           ├─ 📁 data/
│           │   └─ 📄 info.txt
│           └─ 📄 process.log
├─ 📁 opt/
├─ 📁 tmp/
├─ 📁 usr/
├─ 📁 var/
:

2.2. ファイルパス

例に挙げたファイルツリーでは、info.txtというファイルの場所を次のように表記することができます。

/home/project/personal-id/data/info.txt

このような文字列をファイルパス、あるいは単にパスと呼びます。

ヒント

パスはTabキーで補完することができます。

2.3. カレントディレクトリ

カレントディレクトリはシェルが今参照しているディレクトリで、シェル上で作業する際の現在位置になります。ユーザーがログインした直後は、/home/project/personal-idがカレントディレクトリになります(→ホームディレクトリ)。

2.4. 絶対パス

絶対パス/home/project/personal-id/data/info.txtのように、ルートディレクトリから始まるパスです。

ヒント

単にルートディレクトリを指す(絶対)パスは/と書きます。

2.5. 相対パス

絶対パスはディレクトリの階層が深くなるほど長くなってしまいますが、カレントディレクトリまでのパスであれば省略することができます。たとえば、カレントディレクトリが/home/project/personal-idの場合にinfo.txtを指すパスは

project__personal-id@hostname:~
$ data/info.txt

と表記でき、カレントディレクトリがdataであれば単に

project__personal-id@hostname:~/data
$ info.txt

と書くことができます。このようなカレントディレクトリからの相対位置で表現したパスを相対パスと呼びます。

./../は相対パスを書く際に用いる特別な参照です。

./

カレントディレクトリを指し示す。ほとんどの場合、カレントディレクトリにある実行ファイル(→実行権限)を動かす際に用いられます。

../

カレントディレクトリの1つ上の階層のディレクトリ(親ディレクトリ)を示す。

例えばカレントディレクトリがdataの時、/home/project/personal-id/process.logを参照するには../process.logと書きます。また、dataからhomeを参照する相対パスは、../../になります。

2.6. ホームディレクトリ

ログイン時にカレントディレクトリとなるよう設定されているディレクトリのことをホームディレクトリと呼びます。

ホームディレクトリはユーザーごとに割り当てられた作業スペースであり、ユーザーが自由にファイルやディレクトリを作成できるのは、原則としてそのユーザーのホームディレクトリの中に限定されています。ホームディレクトリの外側にあるファイルは、特定の権限を持つユーザーのみが読み書きできるよう設定されていることがほとんどです(→アクセス権の管理)。

警告

一般的なLinux環境では、ホームディレクトリは/home/personal-idになります。ToMMoスーパーコンピューターシステムでは特殊なホームディレクトリの構成を採用しています。詳しくはスパコンのディレクトリ構成をご覧ください。

シェルでのパスの表記で、~(チルダ)はホームディレクトリへの絶対パスを示す特別な記号です。例えば/home/project/personal-id/process.log~/process.logと書くことができます。

2.7. カレントディレクトリの操作

注釈

本資料では使われることの多い機能に絞って紹介します。実際の機能はコマンドのヘルプやmanコマンドを参照してください。

2.7.1. pwd

pwd(Print Working Directory)は現在のカレントディレクトリを表す絶対パスを表示するコマンドです。

$ pwd
/home/project/personal-id

2.7.2. cd

cd(Change Directory)コマンドはカレントディレクトリの変更に使用します。

$ cd /tmp/  # 絶対パスで移動
$ pwd
/tmp
$ cd ../  # 相対パスで移動
$ pwd
/
$ cd  # 引数を省略するとホームディレクトリに移動
$ pwd
/home/project/personal-id

cd -を実行すると1つ前のカレントディレクトリに戻ることができます。

$ pwd
/home/project/personal-id
$ cd /tmp/
$ cd -
/home/project/personal-id
$ pwd
/home/project/personal-id

2.8. ファイルを表示するコマンド

2.8.1. ls

ls(List)コマンドはディレクトリ内のファイルの一覧や、ファイルの情報を表示するコマンドです。

-a

隠しファイルを含めて表示

-l

ファイルの詳細情報を表示

-h

ファイルサイズを読みやすい単位で表示(-lと合わせて使う)

-R

ディレクトリの中身を再帰的に表示

注釈

隠しファイルは名前が.から始まるファイルやフォルダです。オプション無しのlsコマンドやワイルドカードの*(→Globとワイルドカード)では表示されないといった特徴があり、ユーザーが直接読み書きする頻度の少ない・させたくないファイルが隠しファイルになっていることがあります。

$ ls data/  # `data`ディレクトリの中身を表示
info.txt
$ ls -a  # パスが省略された場合はカレントディレクトリの中身を表示
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  data  process.log
$ ls -lh ./ data
./:
合計 4.0k
drwxrwxr-x 2 project__personal-id project  22  4月  1 12:34 data
-rw-rw-r-- 1 project__personal-id project 118  4月  1 14:56 process.log

data:
合計 4.0k
-rw-rw-r-- 1 project__personal-id project 898  4月  1 12:34 info.txt

ヒント

説明

drwxrwxr-x

ファイルタイプ(d)とパーミッション

2

サブディレクトリの数、もしくはリンクの数

project__personal-id

所有者

project

所属グループ

22

サイズ(bytes)

4月 1 12:34

最終更新日

2.8.2. find

findはディレクトリの階層に沿ってファイルの一覧を表示、検索するコマンドです。非常に高機能で様々なオプションがありますが、ここではごく一部のみ紹介します。

$ find data/  # 指定したパスに含まれるファイル・ディレクトリを全て表示
data/
data/info.txt
$ find . -type d  # ディレクトリのみ表示
.
./data
$ find . -name "*.txt"  # ファイル名で検索
./data/info.txt

注釈

find . -name "*.txt"で使われたアスタリスクはGlobとは異なります。ここではアスタリスクが展開されないようにクォートしています。

2.8.3. du

ls -lコマンドではファイル毎のファイルサイズしか表示できませんが、duコマンドを使うとファイルサイズをディレクトリ毎に集計したり、合計を表示することができます。

$ du  # デフォルトの単位は1024 bytes
4    ./data
24   .
$ du -sh  # human-readableな単位で合計のみ表示
24K  .
$ du -d 0 -h  # 表示する階層の深さで指定
24K  .

警告

ファイル数やディレクトリ構造によっては時間がかかったり、ディスクに負荷をかけることがあります。

2.9. Globとワイルドカード

ファイルを操作するコマンドの多くは、複数のパスを引数に指定できます。シェルではワイルドカードを利用することで効率よく複数のファイルを指定することができます。この仕組はglob(グロブ)と呼ばれています。

ワイルドカード

意味

*

0文字以上の任意の文字列

?

任意の1文字

[]

括弧内のどれか1文字

[a-zA-Z]と書くことでアルファベット、[0-9]と書くと数字にマッチさせることができる。

[!]

括弧内に含まれない1文字

$ rm *  # カレントディレクトリ内の全てのファイルを削除
$ ls -l *.txt  # カレントディレクトリ内の`.txt`で終わる名前のファイルを表示
$ ls -lh 000???Y_*.fastq.gz
$ mv mapped.[sb]am data/  # `mapped.sam`と`mapped.bam`を`data/`に移動

ヒント

Globの内容は、echoコマンドやlsコマンドにGlobを渡して実行することで確認できます。

2.10. ファイルとフォルダの操作

2.10.1. mkdir

ディレクトリを作成するコマンドです。

$ ls
data  process.log
$ mkdir work
$ ls
data  process.log  work

-pオプションを付与した場合、親ディレクトリが存在しない際は同時に作成されます。また、対象のディレクトリが存在していてもエラーになりません。

$ ls
data  process.log
$ mkdir work/data1
mkdir: ディレクトリ `work/data1' を作成できません: No such file or directory
$ mkdir -p work/data1
$ find work/
work/
work/data1
$ mkdir work/data1
mkdir: ディレクトリ `work/data1' を作成できません: File exists
$ mkdir -p work/data1
$

2.10.2. touch

ファイルの最終更新日を更新します。ファイルが存在しない場合は空のファイルが作成されます。

$ ls
data  process.log  work
$ touch work/data1/file1.txt
$ ls work/data1/
file1.txt

2.10.3. rm

ファイルやディレクトリを削除します。

危険

ターミナル環境には、いわゆる「ゴミ箱」が存在しません。削除したファイルは直ちに消え、 元に戻すことはできません。

ヒント

意図しない削除への対策には例えば次のような方法があります。

  • 複数のファイルを削除したり、ディレクトリごと削除を行う前にlsコマンド等で確認を行う。

  • -i-Iオプションを使ったり、エイリアスに設定する。

  • 作業の前にバックアップを取る。

  • パーミッションを適切に設定する。

-r

ディレクトリとその中身も削除する

-i

削除の前にユーザーに確認する

-I

ファイルを3つ以上、もしくはディレクトリの削除を行う時はユーザーに確認する

-f

ユーザーへの確認を行わず削除を実行する

$ rm work/data1/file1.txt
$ ls work/data1/
$ rm work/data1/
rm: 'work/data1/' を削除できません: Is a directory
$ rm -r work/data1/
$ ls work/
$

2.10.4. rmdir

空のディレクトリを削除します。

$ touch work/file.txt
$ rmdir work/
rmdir: 'work/' を削除できません: Directory not empty
$ rm work/file.txt
$ rmdir work/
$ ls
data  process.log

ヒント

ディレクトリを中身ごと削除するにはrm -rを使います。

rmdirを使うことでディレクトリが空なことを確認できます。

2.10.5. cp

ファイルやディレクトリのコピーを行います。

cp file [file ...] destination
  • 引数が2つの場合、filedestinationというファイル名でコピーします。

  • destinationがディレクトリの場合、その中に同じファイル名でコピーが作成されます。

  • コピーの対象となるファイルを2つ以上指定することもできます。この時destinationはコピー先のディレクトリを指定します。

危険

コピー先に同じ名前のファイルが存在する場合、ファイルは上書きされ、復元できません。

$ mkdir -p work/data1
$ touch work/data1/file1.txt
$ cp work/data1/file1.txt work/data1/file2.txt  # ファイルのコピー
$ ls work/data1/
file1.txt  file2.txt
$ cp -r work/data1/ work/data2  # ディレクトリごとコピー
$ ls work/
data1  data2
$ cd work/data1/
$ cp file1.txt file2.txt ../  # ファイルをディレクトリにコピー
$ ls ../
data1  data2  file1.txt  file2.txt
-r

ディレクトリを中身ごとコピーする

-i

上書きの前にユーザーに確認する

-f

ユーザーへの確認を行わず上書きする

2.10.6. mv

ファイルやディレクトリの移動、もしくは名前の変更を行います。

mv file [file ...] destination
  • 引数が2つの場合、filedestinationに移動します。

  • destinationがファイル名で終わる場合、ファイル名も変更されます。

  • destinationがディレクトリの場合、その中にファイルを移動します。

  • 移動させるファイルを2つ以上指定することもできます。この時destinationは移動先のディレクトリを指定します。

危険

移動先に同じ名前のファイルが存在する場合、ファイルは上書きされ、復元できません。

$ pwd
/home/project/personal-id/work
$ ls
data1  data2  file1.txt  file2.txt
$ mv file1.txt  file2.txt  # ファイル名を変更
$ ls  # ファイルが既に存在している場合は上書きされる
data1  data2  file2.txt
$ mv data2/ data1/  # ディレクトリの移動
$ ls data1/
data2  file1.txt  file2.txt
-i

上書きの前にユーザーに確認する

-f

ユーザーへの確認を行わず上書きする

2.11. パスに関するコマンド

2.11.1. basename

与えられたパスからディレクトリ名を取り除き、ファイル名のみを表示します。suffixが与えられた場合は、ファイル名の末尾からそれを削除します。

なお、basenameコマンドは指定したファイルやディレクトリが存在するかについて関係なく動作します。

basename name [suffix]
$ basename /home/project/personal-id/data/info.txt
info.txt
$ basename /home/project/personal-id/data/info.txt .txt
info

2.11.2. dirname

与えられたパスのファイル名を取り除き、ディレクトリ名のみを表示します。basenameコマンドと同じく、指定したファイルやディレクトリが存在するかについて関係なく動作します。

$ dirname /home/project/personal-id/data/info.txt
/home/project/personal-id/data
$ dirname info.txt
.
$ dirname /
/