103.3 レッスン 2
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
103 GNUおよびUnixコマンド |
Objective: |
103.3 基本的なファイル管理 |
Lesson: |
2 of 2 |
はじめに
ファイルを見つける方法
システムを使用していると、徐々にファイルの数が増えて消費容量が大きくなっていくため、使いたいファイルを見つけるのが難しくなります。Linuxには、ファイルをすばやく検索して見つけるための find
コマンドが備わっています。find
の構文は次の通りです。
find STARTING_PATH OPTIONS EXPRESSION
STARTING_PATH
-
検索を開始するディレクトリを指定します。
OPTIONS
-
検索の条件や動作を制御します。
EXPRESSION
-
検索条件を定義します。
$ find . -name "myfile.txt" ./myfile.txt
この例での検索開始パスは、現在のディレクトリです。-name
は条件式のひとつで、ファイル名を指定するものです。ここでは myfile.txt
という名前のファイルを探しています。(検索するファイル名に)グロブ文字を使用する場合は、ファイル名全体を必ず引用符で囲みます。
$ find /home/frank -name "*.png" /home/frank/Pictures/logo.png /home/frank/screenshot.png
このコマンドは、/home/frank/
ディレクトリの下にある .png
で終わるファイルを検索します。アスタリスク(*
)の使用法については、前のレッスンを参照してください。
条件を追加して検索を高速化する
find
コマンドは、種別、サイズ、日時 に基づいてファイルを検索することもできます。条件で絞り込むことにより、より短い時間で目的の結果を得ることができます。
ファイル種別による絞り込みを行うには、以下の条件式を使います。
-type f
-
通常ファイルのみを探す。
-type d
-
ディレクトリのみを探す。
-type l
-
シンボリックリンクのみを探す。
$ find . -type d -name "example"
このコマンドは、現在のディレクトリの下で、名前が example
であるディレクトリを探します。
find
で使用できる条件式には、次のようなものがあります。
-name
-
指定された名前を検索します。
-iname
-
名前を検索しますが、大文字と小文字を区別しません(つまり、
myFile
とMYFILE
は区別されません)。 -not
-
条件に一致 しない ものに一致します(条件反転)。
-maxdepth N
-
現在のディレクトリから
N
階層下までを検索します。
更新日時によるファイルの検索
find
では、ファイルの更新日時に基づいて絞り込むこともできます。
$ sudo find / -name "*.conf" -mtime 7 /etc/logrotate.conf
このコマンドは、ファイルシステム全体(開始パスがルートディレクトリ /
)から、文字列 .conf
で終わり、7日以内に変更されたすべてのファイルを検索します。ここでは、管理者しかアクセスできないディレクトリが含まれているため、sudo
を使用しています。 mtime
に渡される引数は、ファイルが最後に変更されてからの 日数 を示します。
サイズによるファイルの検索
find
では、ファイル サイズ に基づいて絞り込むこともできます。たとえば、/var
の下から 2G
より大きいファイルを検索してみましょう。
$ sudo find /var -size +2G /var/lib/libvirt/images/debian10.qcow2 /var/lib/libvirt/images/rhel8.qcow2
-size
条件式は、引数に指定したファイルサイズの条件を満たすものに絞り込みます。引数の例を以下に示します:
-size 100b
-
ちょうど100バイトのファイル
-size +100k
-
100キロバイトを超えるファイル。
-size -20M
-
20メガバイト未満のファイル。
-size +2G
-
2ギガバイトを超えるファイル。
Note
|
空のファイルを見つけるにはこうします: |
結果に基づくアクション
-exec
条件式は、絞り込まれたファイルごとに、指定したアクション(コマンド)を実行します。
$ find . -name "*.conf" -exec chmod 644 '{}' \;
このコマンドでは、現在のディレクトリ(.
)以下の、名前が .conf
で終わるファイル名に絞り込んで、見つけたファイルごとに chmod 644
コマンドを実行してパーミッションを変更します。
'{}' \;
の意味は後で説明しますので、今のところは気にしないでください。
検索結果から grep
で内容をフィルタリングする
grep
を使って、キーワードの出現箇所を検索します。
検索されたファイルから、内容をフィルタリングすることを考えてみましょう。
$ find . -type f -exec grep "lpi" '{}' \; -print Alpine/M helping/M ./.bash_history
このコマンドは、現在のディレクトリ(.
)以下から通常ファイル(-type f
)を検索して、絞り込まれたファイルごとにコマンド grep "lpi"
を実行します。grep
コマンドがステータスコードとして0(成功)を返した場合(すなわち指定した文字列をファイル内で見つけた場合)には、さらにそのファイル名を表示します(-print
)。
中括弧({}
)は、find
が絞り込んだ結果のファイル名を保持するプレースホルダーです。{}
には特殊文字が含まれることがあるので、grep
がファイル名と解釈するように、シングルクォート('
)で囲んでいます。
-exec
条件式は、セミコロン(;
)までをその引数として解釈します。;
はシェルの特殊記号でもあるので、シェルが解釈してしまわないように、エスケープ(\;
)する必要があります。
コマンドの最後に -delete
オプションを指定すると、そこまでの検索条件に一致したすべてのファイルを削除します。このオプションは便利ですが、まず検索条件に一致するファイル名を -print
で確認してから実行するとよいでしょう。
以下の find
コマンドは、現在のディレクトリ以下を検索し、ファイル名が .bak
で終わるすべてのファイルを削除します。
$ find . -name "*.bak" -delete
ファイルのアーカイブ
tar
コマンド(アーカイブと圧縮)
“tape archive(r)” の略である tar
コマンドは、複数のファイルを1つのファイルにまとめた「tarアーカイブ」を作成します。一群のファイルをまとめて移動したり、バックアップしたりするために、アーカイブを利用します。tar
コマンドは、移動やバックアップを行うために、複数のファイルを1つにまとめるツールだと考えればよいでしょう。
1つの tar
コマンドで、tarアーカイブを展開したり、アーカイブに含まれているファイルのリストを表示したり、既存のアーカイブにファイルを追加したりできます。
tar
コマンドの構文は次のとおりです。
tar [OPERATION_AND_OPTIONS] [ARCHIVE_NAME] [FILE_NAME(S)]
OPERATION
-
以下のうち、いずれか1つのオプションが必須です。よく使用する操作は次のとおりです。
--create
(-c
)-
新しいtarアーカイブを作成します。
--extract
(-x
)-
アーカイブから、すべてないし1つ以上のファイルを取り出します(展開)。
--list
(-t
)-
アーカイブに含まれているファイルのリストを表示します。
OPTIONS
-
よく使われるオプションには次のようなものがあります。
--verbose
(-v
)-
tar
コマンドが処理しているファイルの名前を表示します。 --file=archive-name
(-f archive-name
)-
アーカイブファイルの名前を指定します。
ARCHIVE_NAME
-
アーカイブのファイル名。
FILE_NAME(S)
-
アーカイブに入れる、あるいは、アーカイブから取り出すファイル名のリストです。スペースで区切って複数を指定できます。展開時に指定しないと、アーカイブ全体が抽出されます。
アーカイブの作成
現在のディレクトリに stuff
という名前のディレクトリがあり、これを archive.tar
という名前のファイルに保存するには、次のコマンドを実行します。
$ tar -cvf archive.tar stuff stuff/ stuff/service.conf
このコマンドにおけるオプションの意味は次のとおりです。
-c
-
アーカイブを作成します。
-v
-
“verbose”(冗長)モード。アーカイブの処理中に、画面上に進行状況を表示します。
-v
オプションを持つコマンドが、他にもたくさんあります。 -f
-
アーカイブのファイル名を指定します。
1つのファイルや、1つのディレクトリをアーカイブするには、次のコマンドを使用します。
tar -cvf NAME-OF-ARCHIVE.tar /PATH/TO/DIRECTORY-OR-FILE
Note
|
|
複数のディレクトリをまとめてアーカイブするには、/PATH/TO/DIRECTORY-OR-FILE
の部分に、すべてのディレクトリを空白で区切って指定します。
$ tar -cvf archive.tar stuff1 stuff2
このコマンドは、stuff1
と stuff2
を、1つのアーカイブファイル archive.tar
にまとめます。
アーカイブの抽出
同じ tar
コマンドで、アーカイブからファイルを取り出すことができます。
$ tar -xvf archive.tar stuff/ stuff/service.conf
このコマンドは、archive.tar
の内容を現在のディレクトリに展開します。
tar
コマンドによる展開は、アーカイブ作成時の -c
オプションの代わりに、-x
オプションを使用するだけです。
アーカイブの内容を展開するディレクトリを指定するには、-C
オプションを使用します。
$ tar -xvf archive.tar -C /tmp
このコマンドは、 archive.tar
の内容を /tmp
ディレクトリに展開します。
$ ls /tmp stuff
tar
で圧縮する
多くのLinuxディスリビューションに含まれている GNU tar
コマンドは、.tar
アーカイブを作成しながら、それを gzip
や bzip2
形式などで圧縮することができます。
$ tar -czvf name-of-archive.tar.gz stuff
このコマンドは、gzip
圧縮形式(-z
)を使用して、tar
アーカイブを圧縮したファイルを作成します。
gzip
圧縮によって .tar.gz
や .tgz
ファイルを作成することが一般的ですが、tar
は bzip2
圧縮もサポートしています。つまり、.tar.bz2
、.tar.bz
、あるいは .tbz
ファイルと呼ばれる bzip2
形式の圧縮ファイルを作成することもできます。
gzip
圧縮の時には -z
を指定しましたが、bzip2
圧縮の時には、-j
を指定します。
$ tar -cjvf name-of-archive.tar.bz stuff
ファイルを展開する場合は、-c
ではなく -x
を指定します。ここで、x
は “extract” を意味します。
$ tar -xzvf archive.tar.gz
gzip
は処理が高速ですが圧縮率がやや低くく、圧縮後のファイルが bzip2
と比較するとやや大きくなります。bzip2
は処理が低速ですが圧縮率がやや高く、gzip
と比較するとファイルがやや小さくなります。とはいえ、gzip
も bzip2
も圧縮するという点では実質的に同じであり、圧縮率の違い以外はどちらも同じように扱うことができます。
訳注: より圧縮率の高い xz
圧縮も使用できます。tar
で xz
圧縮を使う場合には、-J
オプションを指定します。
なお、圧縮だけを行うコマンドがあります。gzip
圧縮には gzip
コマンドを、bzip2
圧縮には bzip2
コマンドを使用します。たとえば、ファイルを gzip
圧縮するには、次のようにします。
gzip FILE-TO-COMPRESS
gzip
は、対象ファイルの名前の末尾に .gz
を追加した圧縮ファイルを作成します。圧縮ファイルの作成後に、元のファイルは削除されます。
bzip2
コマンド(ならびに xz
コマンド)の操作も同様です。
ファイルを伸張するには、ファイルの圧縮に使用した圧縮形式に応じて、gunzip
、bunzip2
、unxz
のいずれかを使用します。
cpio
コマンド
cpio
は、“copy in, copy out” の略です。このコマンドは、*.cpio
形式や *.tar
形式などのアーカイブファイルを処理します。
cpio
は次のような処理を行います。
-
ファイルをアーカイブにコピーする。
-
アーカイブからファイルを抽出する。
cpio
コマンドは、まず標準入力(主に ls
から出力)から、アーカイブに入れるファイルのリストを取得します。
すなわち、cpio
アーカイブを作成するには、次のようにします:
$ ls | cpio -o > ~/archive.cpio
-o
オプションは、取得したリストに掲載されたファイルを、アーカイブ形式のファイルに出力することを指示します。この例では、作成される出力ファイルは(リダイレクトで指定している)~/archive.cpio
です。ここでの ls
コマンドは、現在のディレクトリの内容をリストします。(訳注: シェルはlsコマンドの実行に先立って、リダイレクトの出力先となるファイルを作成します。そのため、作業ディレクトリの内容をアーカイブする場合には、出力先の archive.cpio
を別のディレクトリに置く必要があります。)
アーカイブを展開するには:
$ cpio -id < archive.cpio
-i
オプションは、アーカイブからファイルを抽出することを指定します。-d
オプションは、必要に応じて展開先のフォルダを作成します。文字 <
は標準入力からのリダイレクトを示します。この例では、展開する入力ファイルは archive.cpio
です。
dd
コマンド
dd
は、ある場所から別の場所にデータを(変換しながら)コピーします。dd
のコマンドライン構文は他の多くのコマンドとは異なり、GNUツールで標準的な -option value
や --option=value
形式ではなく、オプションを option=value
という構文で指定します。
$ dd if=oldfile of=newfile
このコマンドは、oldfile
の内容を newfile
にコピーします。ここで、if=
は入力ファイル(つまりコピー元)を、of=
は出力ファイル(つまりコピー先)を示します。
Note
|
デフォルトでは 例: |
dd
コマンドを使うと、データの大文字/小文字を変更したり、/dev/sdb
などのブロックデバイスに直接書き込んだりすることもできます。
$ dd if=oldfile of=newfile conv=ucase
このコマンドでは、oldfile
のすべての内容が newfile
にコピーされ、すべての英小文字が大文字に変換されます。
次のコマンドは、/dev/sda
にあるハードディスク全体を、backup.dd
という名前のファイルにバックアップします。
訳注: dd
コマンドはメインフレームとのデータ交換に由来するコマンドです。現在では、この例のように ブロックデバイス を丸ごとコピーしたり、バックアップするために主に使われています。bs
オプションは、1度に読み書きするデータブロックのサイズを指定しています。
$ dd if=/dev/sda of=backup.dd bs=4096
演習
-
次の実行例について考察して下さい。
$ find /home/frank/Documents/ -type d /home/frank/Documents/ /home/frank/Documents/animal /home/frank/Documents/animal/domestic /home/frank/Documents/animal/wild
-
実行したコマンドは、何を出力していますか?
-
検索を始めるディレクトリはどこですか?
-
-
バックアップを圧縮したいと考えています。次のコマンドを実行しました。
$ tar cvf /home/frank/backup.tar.gz /home/frank/dir1
バックアップを
gzip
形式で圧縮したいのですが、オプションが不足しています。不足しているオプションは何ですか?
発展演習
-
/var
にある名前が.backup
で終わるファイルが容量を消費するので、システム管理者として定期的にチェックする必要があるとします。-
find
を使って、これらのファイルを見つけるコマンドはどうなりますか? -
分析したところ、それらのファイルのサイズは
100M
から1000M
でした。前のコマンドにこの条件を追加して、100M
から1000M
の.backup
ファイルを見つけるようにしてください。 -
最後に、見つけたファイルを削除するように、コマンドに削除操作を追加してください。
-
-
/var
ディレクトリに、次の4つのバックアップファイルがあります。db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
tar
を使用してdb-first-quarter-2018.backup.tar
という名前のアーカイブファイルを作成してください。 -
アーカイブを
gzip
形式で圧縮するtar
コマンドはどうなりますか? アーカイブのファイル名は、.gz
で終わる必要があります。
-
まとめ
このセクションでは、以下のことを学びました。
-
find
でファイルを見つける方法。 -
find
に条件式を指定して、日時、ファイル種別、サイズに基づく検索条件を追加する方法。 -
見つけたファイルを処理する方法。
-
tar
を使用してファイルをアーカイブ、圧縮、伸張する方法。 -
cpio
でアーカイブを処理する方法。 -
dd
でファイルをコピーする方法。
演習の解答
-
次の実行例について考えて下さい。
$ find /home/frank/Documents/ -type d /home/frank/Documents/ /home/frank/Documents/animal /home/frank/Documents/animal/domestic /home/frank/Documents/animal/wild
-
実行したコマンドは、何を出力していますか?
ディレクトリ
-
検索を始めるディレクトリはどこですか?
/home/frank/Documents
-
-
バックアップを圧縮したいと考えています。次のコマンドを実行しました。
$ tar cvf /home/frank/backup.tar.gz /home/frank/dir1
バックアップを
gzip
形式で圧縮したいのですが、オプションが不足しています。不足しているオプションは何ですか?-z
オプション
発展演習の解答
-
/var
にある名前が.backup
で終わるファイルが容量を消費するので、システム管理者として定期的にチェックする必要があるとします。-
find
を使って、これらのファイルを見つけるコマンドはどうなりますか?$ find /var -name "*.backup"
-
分析したところ、それらのファイルのサイズは
100M
から1000M
でした。前のコマンドにこの条件を追加して、100M
から1000M
の.backup
ファイルを見つけるようにしてください。$ find /var -name "*.backup" -size +100M -size -1000M
-
最後に、見つけたファイルを削除するように、コマンドに削除操作を追加してください。
$ find /var -name "*.backup" -size +100M -size -1000M -delete
-
-
/var
ディレクトリには、次の4つのバックアップファイルがあります。db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
tar
を使用してdb-first-quarter-2018.backup.tar
という名前のアーカイブファイルを作成してください。$ tar -cvf db-first-quarter-2018.backup.tar db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-
アーカイブを
gzip
形式で圧縮するtar
コマンドはどうなりますか? アーカイブのファイル名は、.gz
で終わる必要があります。$ tar -zcvf db-first-quarter-2018.backup.tar.gz db-jan-2018.backup db-feb-2018.backup db-march-2018.backup db-apr-2018.backup
-