ウィルキンソンの炭酸が抜けていく。

webクリエイターのイロハ

Linux コマンド道場

まとめるためのコピペです。ライターさんは以下の方であり、出典も以下のページです。
 
 
 
 
 
 
 
 
 
ライター 福田 和宏
出典:日経Linux 2005年5月号98ページより
(記事は執筆時の情報に基づいており、現在では異なる場合があります)
 
 
ディレクトリの確認と移動

Linuxのファイル・システムは,ツリー(木)構造になっています。ファイル操作などをする際には,現在のディレクトリ位置(場所)を確認して,より作業しやすい位置に移動することがよくあります。現在のディレクトリ位置の確認方法や,ディレクトリの移動方法を覚えておきましょう。

現在のディレクトリを確認

 現在,作業しているディレクトリ(カレント・ディレクトリ)のパス(ディレクトリ・ツリー)を知りたい場合は,pwd(print working directory)コマンドを使います。

$ pwd
/home/fukuda

 すると,ルート・ディレクトリから見た現ディレクトリの位置が,スラッシュで区切られながらフルパスで表示されます。

ディレクトリの移動

 cd(change directory)コマンドの後ろにディレクトリを指定することで,指定したディレクトリに移動できます。例えば,/usr/localディレクトリ移動したい場合は,以下の様にします。

$ cd /usr/local
$ pwd
/usr/local ← 目的のディレクトリに移動した

 また,移動先を何も指定しなかった場合,ユーザーのホーム・ディレクトリに移動します。

$ cd
$ pwd
/home/fukuda ←ユーザーのホーム・ディレクトリに移動した
 
 さらに,ディレクトリの指定には
 
表1のような特殊な記号を用いることもできます。
 
 
表1●ディレクトリの指定に使える,特別な意味を持つ記号
表1●ディレクトリの指定に使える,特別な意味を持つ記号

 

例えば,現在いるディレクトリより1つ上の(親)ディレクトリに移動したい場合は,以下の様にします。

 

$ pwd 
/usr/local/share
$ cd .. 
$ pwd 
/usr/local ← 1つつ上のディレクトリに移動した

 

ディレクトリを記憶しながら移動する

 pushd(push directory),popd(pop directory)コマンドを使うことで,ディレクトリを記憶させながら移動できます。例えば,ホーム・ディレクトリからpushdで/usrディレクトリへ移動したとしましょう。

$ pushd /usr
/usr ~

 すると,ディレクトリの移動とともに,元のディレクトリに加え,移動後のディレクトリが保存されます。pushdの実行後に表示された「/usr ~」は,現在のディレクトリが「/usr」であり,また移動前のディレクトリがホーム・ディレクトリ(~)であることを表しています。

 popdコマンドを実行すると,現在のディレクトリに移る1つ前のディレクトリへ移動します。つまり,前述した例であれば,ホーム・ディレクトリに移動します。

$ popd
~
 
 
 
 
ディレクトリ内のファイル一覧
ライター 福田 和宏
出典:日経Linux 2005年6月号173ページより
(記事は執筆時の情報に基づいており、現在では異なる場合があります
 
 

ディレクトリには,ファイルやディレクトリなどが納められています。今回はディレクトリ内にあるファイルの一覧方法を習得しましょう。

ファイルの一覧を表示する

 カレント・ディレクトリにあるファイルやディレクトリを知りたい場合は「ls」コマンドを実行します。

$ ls
Document_Dir document.txt photo.jpg script.sh

 ターミナル・エミュレータによっては,文字色の違いでファイルの種類やディレクトリなどを識別できます。単色でしか表示されない場合は,「-F」オプションを付けると,

$ ls -F
Document_Dir/ document.txt photo.jpg script.sh*

ファイル名の後ろにファイルの種類を表す記号(表1)が表示されます。例えば,ディレクトリには「/」記号が付きます。

表1●ファイルの種別を表す記号
表1●ファイルの種別を表す記号

特定のディレクトリのファイルを一覧する

 lsコマンドでは,パスを指定すると,そのパス内にあるファイルやディレクトリを表示します。例えば,「~/work」ディレクトリにあるファイルを一覧したい場合は以下のようにします。

$ ls ~/work
report.txt sample.sh chart.oxc

隠しファイルを一覧する

 Linuxを含むUNIX系OSでは,ドット(.)で始まる名称のファイル(ディレクトリ)は隠しファイル(ディレクトリ)です。lsコマンドを実行しても,通常は隠しファイルは表示されません。隠しファイルも表示させたい場合には,「-a」オプションを付けます。

$ ls -a
. .bash_profile Document_Dir photo.jpg
.. .bashrc document.txt script.sh

 上記の例では,lsだけでは表れなかった「.bashrc」などが表示されました。なお,「.」はカレント・ディレクトリ,「..」は親(1つ上)のディレクトリを表します。

ファイル・サイズを表示する

 lsコマンドに「-s」オプションを付けると各ファイルの容量が分かります。単位はKバイトです。

$ ls -s
 4 Document_Dir 243 photo.jpg
25 document.txt 8 script.sh

iノード番号を表示する

 各ファイルはiノード番号を用いて管理されています。各ファイルのiノード番号を調べたいときは,lsコマンドに「-i」オプションを付けます。

$ ls -i
491522 Document_Dir 6242547 document.txt
3866699 photo.jpg 491524 script.sh
 
上記の場合,script.shのiノード番号は「491522」だと分かります。
 
 
 
ファイルの基本操作
ライター 福田 和宏
出典:日経Linux 2005年7月号174ページより
(記事は執筆時の情報に基づいており、現在では異なる場合があります)
 
 

ファイルの操作には,コピー(複写)や削除,名称変更,移動,中身の閲覧,属性の確認・設定などがあります。今回は,このうち削除と名称変更,移動,コピーの方法を習得しましょう。

ファイルを削除する

 ある特定のファイルを削除したい場合は,rmコマンドを利用します。例えば,rmfileファイルを削除したい場合は,

$ rm rmfile

と入力します。複数のファイルを同時に削除することもできます。例えば,rmfile1とrmfile2を同時に削除する場合は,

$ rm rmfile1 rmfile2

のようにファイル名を列挙します。

ファイル名を変更する

 ファイル名を変更したい場合は,mvコマンドを利用します。oldfileファイルの名前をnewfileに変更するには,次のように入力します。

$ mv oldfile newfile

ファイルを移動する

 ファイルの保存場所を変更(移動)したい場合にもmvコマンドを利用します。移動対象となるファイル,移動先のディレクトリの順に指定します。例えば,カレント・ディレクトリにあるmovefileファイルをtargetdirディレクトリに移動したい場合は,

$ mv movefile targetdir

とします。また,移動対象のファイルを複数指定することも可能です。例えば,mfile1とmfile2を移動したい場合は,次のように入力します。

$ mv mfile1 mfile2 targetdir

ファイルのコピー

 ファイルをコピーしたい場合はcpコマンドを利用します。コピー元のファイル,コピー先の順に指定します。例えば,copyfileファイルをtargetdirディレクトリにコピーしたい場合は,

$ cp copyfile targetdir

とします。また,mvコマンド同様にコピー元のファイルを複数指定することもできます。

 カレント・ディレクトリに他のファイル名で複製することも可能です。例えば,srcfileをdistfileというファイル名で複製したい場合は,次のように入力します。

$ cp srcfile distfile

処理の問い合わせ

 ファイルの削除や移動,コピーでの上書きのようにファイルの消失を伴う操作をするときには,本当にそのファイルを削除しても構わないかを確認しながら処理したいことがあります。その際には,それぞれのコマンドに「-i」オプションを指定します。すると,ファイル削除の前に,処理して良いかを問い合わせてきます。

$ rm -i document.txt
rm: remove regular empty file `document.txt'?

 処理しても良ければ「y」または「yes」と入力します。また,逆にファイルを残したい場合は「y」や「yes」以外の文字を入力するか,そのまま[Enter]キーを入力します。

 
 逆に,処理中の問い合わせが一切不要な場合は「-f」オプションを付けます。
 
 
 
ディレクトリの基本操作
 
 

Linuxはファイルなどを格納しておくディレクトリ(Windowsのフォルダに相当します)が利用できます。今回はディレクトリの基本操作方法を紹介します。

ディレクトリを新規作成する

 新たにディレクトリを作成したい場合は,mkdirコマンドを利用します。例えば,newdirというディレクトリを作成する場合は,

$ mkdir newdir

と入力します。また,パスを指定してディレクトリを作成することもできます。その際,作成するディレクトリの親ディレクトリが必要です。もし,親ディレクトリを用意していない場合は,「-p」オプションを指定することで,親ディレクトリも同時に作成できます。例えば,

$ mkdir -p work/datadir

と入力すると,workディレクトリを作成した後にdatadirを作ります。

ディレクトリを削除する

 不必要になったディレクトリは,rmdirコマンドで削除できます。例えば,rubbishdirを削除する場合は,

$ rmdir rubbishdir

と入力します。ただし,ディレクトリの中が何もない状態でないと削除ができません。もし,ディレクトリ内にファイルやサブディレクトリが残った状態でディレクトリごと削除したい場合は,rmコマンドに「-r」オプションを指定します。

$ rm -r rubbishdir

 また,「-f」オプションを同時に指定すると,警告メッセージを表示せずにディレクトリを削除できます。ただし,警告がない分,注意して実行してください。

ディレクトリの移動・名前の変更

 ディレクトリの移動やディレクトリ名を変更したい場合は,ファイルと同様,mvコマンドを利用します。例えば,targetdirディレクトリをmvdirディレクトリに移動したい場合は,

$ mv targetdir mvdir

と入力します。ただし,あらかじめmvdirディレクトリが存在する必要があります。また,olddirをnewdirにディレクトリ名を変更したい場合は,

$ mv olddir newdir

と入力します。

ディレクトリのコピー

 ディレクトリごとコピーを行いたい場合は,cpコマンドに「-r」オプションを指定します。例えば,srcdirをcopydirとしてコピーしたい場合は,

$ cp -r srcdir copydir

と入力します。

 また,/dev/zeroといったスペシャル・デバイスが入ったディレクトリをコピーしようとすると,システムがハングアップしたり,ディスクを使い尽くしたりします。そのためスペシャル・デバイスをコピーしたい場合は,「-R」オプションを利用します。

# cp -R /dev ./
 
 
 

 Linuxには,「複数のファイルを指定して処理する機能」を備えるコマンドが多数用意されています。例えばファイルのコピーを行うcpコマンドでは,コピー元に複数のファイルを指定し,一括して目的のディレクトリ内にそれらのコピーを作成できます。しかし,多数のファイルを指定する場合は,それらすべてのファイル名を入力しなければならず,面倒です。

 複数のファイルを指定するのに役立つのが,ワイルドカードです。ワイルドカードには,トランプでいうジョーカーのような役割があります。つまり,任意の文字や文字列を表せる記号です。例えば,「ある拡張子を含んだファイルをすべて指定する」といったことが簡単にできます。

 では,Linuxで利用できるワイルドカードを習得しましょう。

任意の1文字を表す「?」

 任意の1文字を表せるワイルドカードが「?」です。「file?」と指定すると,「file1」や「fileA」など,「?」の位置に任意の1文字が入るファイルを指定できます。「?」を複数利用することもできます。例えば,Fileの後に任意の3文字が付くファイルを削除したい場合は,

$ rm file???

と入力します。

 ただし,ドット・ファイルに利用される先頭の「.」記号は,?で表せません。例えば,「?file」としても「.file」は含まれません。

任意の文字列を表す「*」

 任意の0文字以上の文字列を表せるワイルドカードが「*」です。「file*」と指定すると,「fileA」や「filename」などのファイル名を表せます。また,「file*」の場合は,「file」といった全く文字が付かない場合も表されます。

 例えば,png拡張子が付いたファイルをphotoディレクトリに移動したい場合は,

$ mv *.png photo

と指定します。また,「*」のみを指定するとすべてのファイルが指定されます。

 ただし,「*」はファイルの先頭に「.」があるドット・ファイルを表せません。ドット・ファイルを指定したい場合には,「.*」と指定します。

指定文字のいずれかを表す「[...]」

 指定した文字のいずれかを含んだファイルを表したい場合には「[...]」を利用します。例えば,「File」または「file」を削除したい場合は,

$ rm [Ff]ile

と入力します。

 また,マイナス(-)記号で文字の範囲を利用することも可能です。例えば,数字1文字を表すには「[0-9]」とします。同様にアルファベットなら「[a-zA-Z]」と指定します。

指定文字列のいずれかを表す「{...}」

 指定した文字列のいずれかを含んだファイルを表したい場合には,「{...}」を利用します。文字列の指定には,文字列の間をカンマ(,)で区切ります。例えば,jpgまたはgif拡張子に含んだファイルをgrpディレクトリにコピーしたい場合は,

$ cp *.{jpg,gif} grp

と実行します。

 また,指定したい文字列に「{」,「}」,「,」の記号を含む場合は,それぞれの記号の前に「\」を付けます。a,bまたはcdを含むファイルを削除したいなら,

$ rm *{a\,b,cd}*
 
と入力します。
 
 
 
ファイルの詳細閲覧
 
 

 「ls」は,ディレクトリ内にどのようなファイルが存在するかを確認するためのコマンドです。このほかにもlsコマンドは,ファイルの属性や状態を確認したいときに役立ちます。

ファイルの状態を閲覧する

 ファイルの属性や状態を知りたい場合には,「-l」オプションを付けます。すると図1のように各行にそれぞれのファイルの詳細が表示されます。各項目の意味は以下の通りです。

図1●ファイルの詳細を表示
図1●ファイルの詳細を表示
「ls -l」コマンドを実行することで,各ファイルの詳細も表示される。  [画像のクリックで拡大表示]

第1項目:ファイル種別とパーミッション

 はじめの10個の記号はファイル種別とパーミッションを表します。1文字目はファイルの種類を表し,「-」はファイル,「d」はディレクトリ,「l」はシンボリック・リンクの意味です。

 2文字目から10文字目はパーミッションの状態を表示します。パーミッションとはファイルの書き出しや読み込み,実行を制御する機能です。「ファイルの所有者」「グループ」「その他のユーザー」ごとに,アクセス制限が行えます。

 表示は図2のように3文字ごとに分かれており,「r」がある場合はファイルの読み込みが可能,「w」は書き出しが可能,「x」は実行が可能を表します。

図2●アクセス制限を表す「パーミッション」
図2●アクセス制限を表す「パーミッション
3文字ごとに所有者,グループ,その他のユーザーのアクセス制限を表している。

2項目:ディレクトリ数とハード・リンク数

 ディレクトリの場合は,第2項目にディレクトリ内にあるサブ・ディレクトリの数が表示されます。ただし,親ディレクトリを表す「../」とカレント・ディレクトリを表す「./」も含まれるため,サブ・ディレクトリがない場合でも「2」と表示されます。

 ファイルの場合はハード・リンクの数が表示されます。「2」以上の場合はハード・リンクが存在します。

第3,4項目:所有者とグループ

 第3項目には,ファイル所有者のユーザー名が表示されます。第4項目にはファイルのグループが表示されます。グループには,複数のユーザーが所属できます。どちらも第1項目のパーミッションによって,ユーザーがファイルの読み書きや実行を行えるかが決まります。

第5項目:容量

 

 第5項目には,ファイルの容量がバイト単位で表示されます。また,容量が大きく把握しずらい場合は,「-h」オプションを同時に付けることで適切な単位で容量が表示されます。

第6項目:タイム・スタンプ

 第6項目には,ファイルの更新時刻が表示されます。また,最後にアクセスした時刻を表示したい場合は,「-u」オプションを同時に付けます。

第7項目:ファイル名とリンク先

 
 最後にファイル名,ディレクトリ名などが表示されます。また,シンボリック・リンクの場合は,「リンク名 -> リンク先」のように表示されます。
 
 
リンク
 

 ディレクトリの深部(階層の深いところ)や普段利用しないディレクトリにあるファイルにアクセスするには,ディレクトリを移動したり,パスを指定したりする必要があります。その際に長いパス名を指定するのは面倒です。

 そうしたときに便利なのが「リンク」です。仮のファイルにアクセスすることで,そのファイルの実体にアクセスしたのと同じになります。Windowsの「ショートカット」とよく似た機能と言えます。

 Linuxでは,「ハード・リンク」と「シンボリック・リンク」の2種類が利用できます。

ハード・リンク

 Linuxでのファイルは,ファイルの実体とファイル名に分かれて,ファイル・システムに保存されています。実体とファイル名を結び付けるのが,「iノード」番号です。

 ハード・リンクは複数のファイル名が同じiノード番号を持つことで,リンクを実現しています。例えば,ファイルの実体のiノード番号は2431で,ファイル名「file1」と「file2」のそれぞれのiノード番号が2431であれば,どちらのファイル名にアクセスしても同じ実体にアクセスされます。

 このハード・リンクには,2つの異なるファイル・システムをまたいでリンクを張れないなどの制限があります。

ハード・リンクの作成

 ハード・リンクを作成するときは,lnコマンドの後にリンク先(実体),リンク元(リンク・ファイル)の順に指定します。例えば,/usr/local/bin/script.shファイルのリンクをホーム・ディレクトリに作成するには,

$ ln /usr/local/bin/script.sh ~/

と実行します。すると,カレント・ディレクトリにハード・リンクの「script.sh」が作成されます。こうして作成されたリンク・ファイルは,ファイルの詳細を実行すると,リンク数が2以上になっています(図1)。

図1●リンクの確認
図1●リンクの確認
「ls -l」コマンドを実行することで,リンク・ファイルか実体を確認できます。ハード・リンクは第2項目が2以上に,シンボリック・リンクははじめに「l」と表示されます。
[画像のクリックで拡大表示]

シンボリック・リンク

 シンボリック・リンクは,リンク・ファイルにリンク先のパスを保存しておくリンク方法です。例えば,「/usr/bin/sh」にリンクを張ると,リンク・ファイルにはこのパスが保存されます。リンク・ファイルにアクセスすると,保存されているパスを閲覧して,リンク先のファイルが呼び出される仕組みです。ハード・リンクのような制限がないこともあり,シンボリック・リンクが主に利用されています。

 シンボリック・リンクでの注意点は,リンク先が移動/削除/名前変更されると,リンク・ファイルはデッド・リンク(リンク先のないリンク・ファイル)になってしまうことです。

シンボリック・リンクの作成

 シンボリック・リンクはlnコマンドに「-s」オプションを付けて利用します。例えば,work/doc/text.txtファイルのリンクをカレント・ディレクトリに作成するには,

$ ln -s work/doc/text.txt ./

と実行します。すると,カンレント・ディレクトリにリンク・ファイルの「text.txt」が作成されます。また,ファイルの詳細を実行すると,ファイル種別に「l」が付いています(図1)。さらにファイル名は「リンク名 -> リンク先のパス」のように表示されます。

 
 シンボリック・リンクのアクセス権は,リンク先のファイルのパーミッションによって決定されます。
 
 
アクセス権限
 

Linux複数のユーザーが同時に利用できる,マルチユーザー対応OSです。このようなOSは,ユーザーごとにファイルのアクセス権を管理することが不可欠です。Linuxでも当然,アクセス権を利用できます。

 アクセス権はファイルやディレクトリごとに設定されます。「所有者」「グループ」「その他」という3種類のユーザーについて「読み込み」「書き出し」「実行」という権限を制御できます。権限(パーミッション)の確認には「ls -l」コマンドを利用します。

パーミッションを変更するchmod

 パーミッションの変更には,chmodコマンドを利用します。

chmod モード 変更するファイルやディレクトリ

のように指定して実行します。

 モードはアクセス権をどのように変更するかを記述します。モードの指定は「アルファベットで指定する」方法と「数値で指定する」方法の2つを利用できます。

アルファベットで指定する

 アルファベットでの指定は,

変更対象 変更方法 変更内容

の順に記述します。各項目には表1の文字や記号が使えます。

表1●アルファベットでのモード指定
表1●アルファベットでのモード指定

 変更方法で「+」を利用すると,前に記述した変更対象について,後に記述した権限が付与されます。例えば,所有者に書き出し権限を付与したい場合は,

chmod u+w target_file

と実行します。

 逆に「-」を利用すると,権限を取り除けます。例えば,グループとその他のユーザーから実行権限を取り除きたい場合は,

chmod go-x target_file

と実行します。

 「=」は,続けて記述した権限と同じに設定します。例えば,すべてのユーザーに対して読み込み権限と書き出し権限のみを設定したい場合は,次のように実行します。

$ chmod a=rw target_file

「=」の後に何も記述しないと,権限をすべて取り除きます。

数値で指定する

 権限は「rwxr-xr--」のように9桁(けた)の記号で表されます。このアルファベットの部分を「1」に,「-」の部分を「0」にすると,2進数で表せます。chmodではこの数字を8進数にしたものをモードとして利用することができます。

 権限から8進数にするには3桁ごとに分け,表2に当てはめて考えると簡単に変換できます。

 

表2●数字でのモード指定
表2●数字でのモード指定

 

例えば,「rwxr-xr--」のような権限であれば,「111101100」となり,8進数では「754」のように表せます。この8進数の権限を,chmodのモードに記述して権限を変更できます。

$ chmod 754 target_file
 
 
 
ファイルの検索(1)
 

Linuxのファイル・システムには通常,膨大なファイルやディレクトリが保存されています。この中から特定のファイルやディレクトリを探し出すのは手間がかかります。そこで,ファイルやディレクトリを検索するコマンドの使い方をマスターしましょう。ファイルやディレクトリの検索には,findコマンドを利用します。

findコマンドでの検索

 findコマンドは,次の構文で記述します。

find 検索先 判別式 アクション

 検索先にはディレクトリを指定します。指定したディレクトリ以下のファイルやディレクトリが検索対象となります。

 判別式は検索する条件を記述します。例えば,ファイル名の一部やファイルの種別,ファイル容量などを指定していきます。また,複数の判別式を列挙することもできます。

 アクションは検索したファイルについて処理を行うコマンドを記述します。例えば,検索したファイルを別のディレクトリに移動するといった処理が行えます。

ファイル名で検索する

 検索したいファイルなどの名前が分かっている場合は,findコマンドに「-name」判別式を利用します。例えば,mydoc.txtというファイルをファイル・システム内から検索したい場合は,

$ find / -name mydoc.txt

と入力します。検索中,見つかったファイルやディレクトリが随時一覧表示されていきます。

 2項目の「/」はルート・ディレクトリ以下を検索対象にすることを表しています。もし,ホーム・ディレクトリ以下を検索対象にしたい場合は,2項目のディレクトリを変更します。

$ find ~/ -name mydoc.txt

ファイル名の一部から検索する

 ファイル名の一部しか分かっていない場合や,特定の拡張子のファイルのみを探し出すときなどにはワイルド・カードを利用できます。利用できるワイルド・カードは1文字を表す「?」,0文字以上の文字列を表す「*」,指定したいずれかの1文字を表す「[...]」が利用できます。

 例えば,拡張子が「txt」のファイルを探す場合は,

$ find ~/ -name *.txt

とします。また,Photo001.jpgのような型番が3桁(けた)のファイルを探す場合は,

$ find ~/ -name Photo???.jpg

と実行します。

ファイル種別を指定して検索

 ファイル・システム内に,同じ名前のファイルやディレクトリが存在したとします。その名前で検索すると,いずれも結果に表示されます。ファイル種別を限定して検索したい場合は,「-type」判別式を用います。

 ファイル種別の指定には,表1が利用できます。

表1●「-type」に利用できるファイル種別
表1●「-type」に利用できるファイル種別

例えば,documentというディレクトリのみを検索したい場合は,

$ find / -name document -type d

と実行します。

 
 
 
ファイルの検索(2)
 
 

ファイルやディレクトリには,名前のほかに,所有しているユーザー,アクセス権限,ファイル・サイズ,タイムスタンプなどの情報が付加されています。findコマンドではこれらの情報を用いてファイル検索が行えます。

ファイル・サイズで検索する

 ファイルのサイズで検索を行う場合は判別式に「-size」を使います。指定する数字の後に「c」を付けるとバイト,「k」を付けるとKバイト単位での指定ができます。例えば,1Kバイトのファイルを探す場合は,次のように実行します。

$ find . -size 1k

 また,指定する数字の前に「+」を付けると指定したサイズ以上のファイル,「-」を付けると指定したサイズ以下のファイルが検索対象になります。例えば,10Kバイト以上のファイルを検索する場合は,

$ find . -size +10k

と実行します。さらに,容量の範囲を指定することも可能です。例えば,10Kバイト以上100Kバイト以下のファイルを探す場合は,次のように実行します。

$ find . -size +10k -size -100k

パーミッションから検索を行う

 パーミッションを指定して検索する場合は,判別式に「-perm」を使います。例えば,パーミッションが「rwxr-xr-x」(755)のファイルを探すには,次のように実行します。

$ find . -perm 755

 特定のパーミッションを条件にして検索することも可能です。指定したパーミッションを含むファイルを探すには,パーミッションの前に「-」を付けます。例えば,ユーザー,グループ,その他のユーザーのすべてが読み込み可能なファイルを探すには,

$ find . -perm -444

と実行します。また,指定したパーミッションのいずれかを持つファイルを探すには,パーミッションの前に「+」を付けます。例えば,ユーザー,グループ,その他のユーザーのいずれかに実行権限が付いているファイルを探すには,

$ find . -perm +111

と実行します。

タイムスタンプから検索を行う

 ファイルのタイムスタンプから検索を行うには,表1のような判別式を使います。

表1●タイムスタンプから検索するときに使える判別式
表1●タイムスタンプから検索するときに使える判別式

例えば,最後にアクセスした時間が2時間前のファイルを探すには,次を実行します。

$ find . -amin 120

 時間の範囲を指定することもできます。指定した数字の前に「+」を付けると指定した以前にアクセスしたファイルを,「-」を付けると指定した以後にアクセスしたファイルを,検索します。例えば,10日前から20日前までに変更されたファイルを探すには,次のように実行します。

$ find . -mtime +10 -mtime +20
 
 
 
 
 
ファイルの検索(3)
 

 findコマンドはファイルやディレクトリなどを探し出すだけではなく,検索結果をファイルとして保存したり,他のコマンドと組み合わせて使うことで,より便利に使えます。

検索結果を詳細表示する

 検索したファイル名のほかに,パーミッション,所有者,容量などを同時に表示させたい場合は,アクション(表1)に「-ls」を指定します。

表1●findで利用できる主なアクション
表1●findで利用できる主なアクション

例えば,1Mバイト以上のファイルを検索し,詳細な情報を一覧表示するには,次のように実行します。

$ find ./ -size +1024k -ls

検索したファイルを他のコマンドで処理する

 検索結果に対してほかのコマンドで処理したい場合は,findコマンドのアクションに「-exec コマンド \;」(\は,半角のバックスラッシュの場合もある。以下は,バックスラッシュで表現)を指定します。また,検索結果のファイル名は「{ }」で置き換えられます。

 例えば,拡張子がtxtのファイルをdocディレクトリに移動するには,以下のように実行します。

$ find ./ -name *.txt -exec mv {} doc ;

 「-exec」を「-ok」に変更すると各検索結果をコマンドで処理する前にユーザーに実行するか否かを聞くようになります。例えば,最終アクセス時間が30日より以前のファイルをユーザーに確認してから削除するには,以下のように実行します。

$ find ./ -atime +30 -exec rm {} old ;

高速にファイルを検索する

 findコマンドは対象となるファイルやディレクトリすべてを検索するため,検索時間が長くなりがちです。ファイル・システム上にあるファイルすべてを対象にすると,数分から数十分も検索時間がかかることがあります。

 そこで高速に検索を行いたい場合は,locateコマンドを利用します。locateコマンドはあらかじめファイルやディレクトリのデータベースを作成しておき,それを利用して検索します。

 mydoc.txtを検索したい場合は,

$ locate mydoc.txt

と実行します。すると,ファイルやディレクトリの名前にmydoc.txtを含むものが一覧表示されます。

 ただし,locateコマンドはファイル名やディレクトリ名のみについて限定した検索が行え,findコマンドのようなファイル種別やパーミッションなどでの検索は行えません。また,ファイル名にワイルド・カードも使えません。ワイルド・カードを使って検索を行いたい場合は,locateで大まかにファイルを検索し,その結果をgrepで絞り込むとよいでしょう。例えば,/home/fukudaディレクトリ内にある,ファイル名がPから始まり,拡張子にjpgを持つファイルを検索する場合は,

$ locate /home/fukuda | grep "^/home/fukuda/.*P.*.jpg$"

などと実行します。

 locateコマンドを利用するにはあらかじめデータベースを作成しておく必要があります。データベースの作成には,updatedbコマンドを利用します。ただし,updatedbコマンドは管理者のみが実行可能なコマンドです。通常,Linuxディストリビューションではupdatedbコマンドを午前4時ごろに実行するように設定されています。また,updatedbコマンドの実行以降に作成されたファイルやディレクトリはlocateコマンドでの検索対象にはなりません。