警告
本資料は参考情報として提供されています。内容についてのご質問には必ずしもお答えできない可能性がございます。
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¶
ファイルの詳細情報を表示
- -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
2.8.2. find¶
find
はディレクトリの階層に沿ってファイルの一覧を表示、検索するコマンドです。非常に高機能で様々なオプションがありますが、ここではごく一部のみ紹介します。
$ find data/ # 指定したパスに含まれるファイル・ディレクトリを全て表示
data/
data/info.txt
$ find . -type d # ディレクトリのみ表示
.
./data
$ find . -name "*.txt" # ファイル名で検索
./data/info.txt
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文字
|
|
括弧内に含まれない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¶
ファイルやディレクトリを削除します。
危険
ターミナル環境には、いわゆる「ゴミ箱」が存在しません。削除したファイルは直ちに消え、 元に戻すことはできません。
ヒント
意図しない削除への対策には例えば次のような方法があります。
- -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つの場合、
file
をdestination
というファイル名でコピーします。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つの場合、
file
をdestination
に移動します。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 /
/