▼すべてを開く。
▲すべてを閉じる。
$ ls -lR .: 合計 4 drwxr-xr-x 2 masa users 4096 7月 30 18:43 dir lrwxrwxrwx 1 masa users 8 7月 30 19:02 s-linkfile -> dir/file ./dir: 合計 4 -rw-r--r-- 1 masa users 256 4月 2 17:39 file
$ rm s-linkfile
rmコマンドで、削除するシンボリックリンクファイル「s-linkfile」を指定すると、シンボリックリンクファイルが削除される。
lsコマンドで実行結果を見る$ ls -lR .: 合計 4 drwxr-xr-x 2 masa users 4096 7月 30 18:43 dir ./dir: 合計 4 -rw-r--r-- 1 masa users 256 4月 2 17:39 file
rmコマンドでは、シンボリックファイルが削除されてリンクが消滅するだけで、元のファイルは削除されない。リンク元のファイルを削除したい場合は、rmコマンドでリンク元のファイルを指定して削除する。一度にシンボリックリンクファイルとリンク元のファイルの両方を削除するコマンドはない。
$ ls -lR .: 合計 8 drwxr-xr-x 2 masa users 4096 7月 30 18:43 dir -rw-r--r-- 2 masa users 256 4月 2 17:39 h-linkfile ./dir: 合計 4 -rw-r--r-- 2 masa users 256 4月 2 17:39 file
$ rm h-linkfile
rmコマンドで、削除するハードリンクファイル「h-linkfile」を指定すると、ハードリンクファイルが削除される。
lsコマンドで実行結果を見る$ ls -lR .: 合計 4 drwxr-xr-x 2 masa users 4096 7月 30 18:43 dir ./dir: 合計 4 -rw-r--r-- 1 masa users 256 4月 2 17:39 file
ハードリンクファイルは、普通のファイルと同様に削除することができる。そのため、普通のファイルと思って削除しても、ハードリンクファイルが残っていたりすることがあるので、注意しなくてはならない。
また、ハードリンクファイルは、通常のファイルとはリンク数の表示で区別するしかない。どのファイルとハードリンクが張られているかを調べる方法はない。lsコマンドのiオプションでi-ノード番号を表示させて、これから同じi-ノードを見つけ出す方法ぐらいしかない。
$ rm file1.txt
rmコマンドで削除するファイル「file1.txt」を指定すると、「file1.txt」が削除される。
削除できるファイル |
---|
自分に所有権があるファイル |
所有権が同じグループのユーザであるファイル |
ディレクトリを削除しようとしても、削除できない。
$ rm dir rm: cannot remove `dir': ディレクトリです
ディレクトリを削除する場合は、-rオプションを使う。
ファイルに書き込み許可がない場合、削除してもよいか問い合わせてくる。
lsコマンドで削除するファイルを見る$ ls -l -r--r--r-- 1 masa users 206 8月 11 18:32 file21.txt
$ rm file21.txt rm: remove write-protected 通常ファイル `file21.txt'? y
削除してもよい場合は「y」[Return]を入力、削除しない場合は「n」[Return]を入力する。
$ ls -l -rw-r--r-- 1 masa users 256 10月 10 12:57 #file#
$ rm '#file#'または
$ rm "#file#"または
$ rm \#file#
rmコマンドで、上のようにファイルを指定するとファイル「#file#」が削除される。
$ rm #file# rm: 引数が足りません
普通に「#file#」を削除しようとすると、「引数が足りません」というエラーメッセージが出る。これは、シェルが「#」をコメントと解釈してrmコマンドにファイル名「#file#」を渡さないため、上のようなエラーメッセージになる。
意図しないファイルを誤って削除しないために、削除するファイルをlsコマンドで直接指定して、目的のファイルだけが表示されるかを確認する。
lsコマンドでファイルが正しく指定できない例$ ls #file# #file# * ** *** **** ***** -file \ ~masah
シェルが「#」をコメントと解釈するため、単純なlsコマンドが実行されてすべてのファイルが表示される。
lsコマンドでファイルが正しく指定できた例$ ls \#file# #file# $ ls '#file#' #file# $ ls "#file#" #file#
シェルに「#」をコメントと解釈させないために、ファイル名の前にエスケープ文字「\」を付けて「\#file#」とするか、ファイル名を引用符「'」で囲って「'#file#'」、また二重引用符で囲って「"#file#"」と指定すると正しくファイル「#file#」が表示される。
$ ls -l 合計 20 -rw-r--r-- 1 masa users 256 10月 10 17:25 * -rw-r--r-- 1 masa users 256 10月 10 17:25 ** -rw-r--r-- 1 masa users 256 10月 10 17:25 *** -rw-r--r-- 1 masa users 256 10月 10 17:25 **** -rw-r--r-- 1 masa users 256 10月 10 17:25 *****
$ rm '***'または
$ rm "***"または
$ rm \*\*\*
rmコマンドで、上のようにファイルを指定するとファイル「***」が削除される。
$ rm *
「*」は、シェルにワイルドカードとして解釈されるので、ワイルドカード指定に該当するファイルが削除されてしまう。
意図しないファイルを誤って削除しないために、削除するファイルをlsコマンドで直接指定して、目的のファイルだけが表示されるかを確認する。
lsコマンドでファイルが正しく指定できない例$ ls *** ls: オプションが違います -- e 詳しくは `ls --help' を実行して下さい. $ ls \*** * ** *** **** *****
$ ls \*\*\* *** $ ls '***' *** $ ls "***" ***
シェルが「*」を解釈しないようにエスケープ文字「\」をすべての「*」の前に入れて「\*\*\*」とするか、引用符で囲って「'***'」、二重引用符で囲って「"***"」と指定すると正しくファイル「***」が表示される。
$ ls -l -rw-r--r-- 1 masa users 256 10月 10 21:28 ~masa
$ rm '~masa'または
$ rm "~masa"または
$ rm \~masa
rmコマンドで、上のようにファイルを指定するとファイル「~masa」が削除される。
$ ls -l -rw-r--r-- 1 masa users 256 10月 10 21:22 ~masahi
システムに「masahi」という名前のホームディレクトリが存在しない場合は、通常のファイル同様に扱える。
$ ls ~masahi ~masahi $ rm ~masahi
$ rm ~masa rm: cannot remove `/home/masa': 許可がありません
「~masa」は、ユーザ「masa」のホームディレクトリを示すため、ファイル「~masa」が削除されない。
意図しないファイルを誤って削除しないために、削除するファイルをlsコマンドで直接指定して、目的のファイルだけが表示されるかを確認する。
lsコマンドでファイルが正しく指定できない例$ ls ~masa evolution filesize lfile2 mbox proj sfile1 work
lsコマンドでも「~masa」はホームディレクトリと解釈されて、ホームディレクトリの内容が表示される。
lsコマンドでファイルが正しく指定できた例$ ls \~masa ~masa $ ls '~masa' ~masa $ ls "~masa" ~masa
シェルが「~」を解釈しないようにエスケープ文字「\」をファイル名の前につけて「\~masa」とするか、引用符で囲って「'~masa'」、二重引用符で囲って「"~masa"」と指定すると正しくファイル「~masa」が表示される。
$ ls -l -rw-r--r-- 1 masa users 256 10月 10 22:57 '*'
$ rm \'\*\'または
$ rm "'*'"
rmコマンドで、削除するファイルのファイル名を1文字ずつエスケープ記号「\」でエスケープすると、ファイル「\'\*\'」が削除される。エスケープ記号を使う代わりに、ファイル名を2重引用符「"」で囲ってもよい。
$ rm '*' rm: cannot lstat `*': そのようなファイルやディレクトリはありません
これは、rmコマンドに「*」というファイル名が渡されるためにこのようなエラーとなる。ただし、実際に「*」というファイルがあれば削除されてしまう。
意図しないファイルを誤って削除しないために、削除するファイルをlsコマンドで直接指定して、目的のファイルだけが表示されるかを確認する。
lsコマンドでファイルが正しく指定できない例$ ls '*' ls: *: そのようなファイルやディレクトリはありません $ ls ''*'' ls: オプションが違います -- e
これは、シェルが「'」と「'」に囲まれた「*」をファイル名と解釈してlsコマンドに与えたためにこのようなエラーになる。この場合、ファイル名が「*」のファイルがあればエラーとならずにファイル「*」が表示される。
lsコマンドでファイルが正しく指定できた例$ ls \'\*\' '*' $ ls "'*'" '*'
シェルが「'」を解釈しないようにエスケープ文字「\」を「'」の前に入れて「\'\*\'」とするか、二重引用符で囲って「"'*'"」と指定すると正しくファイル「'*'」が表示される。
$ ls -l -rw-r--r-- 1 masa users 256 10月 10 22:42 ''
$ rm \'\'または
$ rm "''"
rmコマンドで、削除するファイルのファイル名を1文字ずつエスケープ記号「\」でエスケープすると、ファイル「''」が削除される。エスケープ記号を使う代わりに、ファイル名を2重引用符「"」で囲ってもよい。
$ rm '' rm: cannot lstat `': そのようなファイルやディレクトリはありません
これは、シェルが「'」と「'」に囲まれた文字数0のファイル名をrmコマンドに渡したためにこのようなエラーとなる。
意図しないファイルを誤って削除しないために、削除するファイルをlsコマンドで直接指定して、目的のファイルだけが表示されるかを確認する。
lsコマンドでファイルが正しく指定できない例$ ls '' ls: : そのようなファイルやディレクトリはありません $ ls '''' ls: : そのようなファイルやディレクトリはありませんこれは、シェルが「'」と「'」に囲まれた文字数0のファイル名をrmコマンドに渡したためにこのようなエラーとなる。 lsコマンドでファイルが正しく指定できた例
$ ls \'\' '' $ ls "''" ''
シェルが「'」を解釈しないようにエスケープ文字「\」をすべての「'」の前に入れて「\'\'」とするか、二重引用符で囲って「"''"」と指定すると正しくファイル「''」が表示される。
$ ls -l -rw-r--r-- 1 masa users 256 10月 10 18:40 -file
$ rm -- -file
rmコマンドで、「--」削除するファイル「-file」指定すると、ファイル「-file」が削除される。
$ rm -file rm: オプションが違います -- l
rmコマンドは、ファイル名「-file」をオプションと解釈してしまう。
「-」をオプションと解釈させないためにエスケープ文字を使ってみる。
$ rm \-file rm: オプションが違います -- l $ rm '-file' rm: オプションが違います -- l $ rm "-file" rm: オプションが違います -- l
どれもうまくいかない。
意図しないファイルを誤って削除しないために、削除するファイルをlsコマンドで直接指定して、目的のファイルだけが表示されるかを確認する。
lsコマンドでファイルが正しく指定できない例$ ls -file ls: オプションが違います -- e $ ls \-file ls: オプションが違います -- e $ ls '-file' ls: オプションが違います -- e $ ls "-file" ls: オプションが違います -- e
ファイル名を「\-file」、「'-file'」、「"-file"」と指定しても、lsコマンドは「-file」をファイル名ではなくオプションと解釈してしまう。lsコマンドのオプションに「f,i,l」はあるが「e」がないため、「オプションが違います」というエラーになる。
lsコマンドでファイルが正しく指定できた例$ ls -- -file -file
lsコマンドのオプションに「--」を指定し、ファイル名「-file」を指定すると正しくファイル「-file」が表示される。これは、「--」が空のオプションを指定するからと推測される。
$ ls -l -rw-r--r-- 1 masa users 256 10月 10 15:02 \
$ rm '\'または
$ rm \\
rmコマンドで、削除するファイルを引用符「'」で囲って「'\'」指定すると、ファイル「\」が削除される。エスケープ文字「\」を使ってファイル名を「\\」と指定しても削除できる。
$ rm \ >
「\」記号を入力して[Return]を押すと、シェルは行が続くと解釈して入力するためのプロンプト「>」を表示する。そのため、ファイル「\」を指定することができない。
意図しないファイルを誤って削除しないために、削除するファイルをlsコマンドで直接指定して、目的のファイルだけが表示されるかを確認する。
lsコマンドでファイルが正しく指定できない例$ ls \ > $ ls "\" >
「\」記号を入力して[Return]を押すと、シェルは行が続くと解釈して入力するためのプロンプト「>」を表示する。そのため、ファイル「\」を指定することができない。
lsコマンドでファイルが正しく指定できた例$ ls '\' \ $ ls \\ \
シェルが「\」を解釈しないように引用符で囲ってファイル名を「'\'」とするか、エスケープ文字「\」をファイル名の前に入れて「\\」と指定すると正しくファイル「\」が表示される。
$ ls -l -rw-r--r-- 1 masa users 256 6月 12 18:36 file 1.txt
$ rm 'file 1.txt'または
$ rm "file 1.txt"
rmコマンドで、削除するファイルを引用符「'」で囲って「'file 1.txt'」指定すると、「file 1.txt」が削除される。引用符の代わりに2重引用符「"」で囲ってもよい。
$ rm file 1.txt rm: cannot remove `file': そのようなファイルやディレクトリはありません rm: cannot remove `1.txt': そのようなファイルやディレクトリはありません
普通に「file 1.txt」を削除しようとすると、シェルがrmコマンドに「file」と「1.txt」の2つの文字列を別々に渡す。そのため、上のようにrmコマンドが2つのファイルと解釈してエラーメッセージを出す。ファイル名を引用符「'」または2重引用符「"」で囲うことにより、シェルが1つの文字列としてrmコマンドに文字列を渡して削除できる。
$ find . -type f -empty -exec rm {} \;
findコマンドで、検索するディレクトリ「.」検索する対象を指定する「-type」対象がファイルであることを示す「f」サイズが0を示す「-empty」、検索結果を引数としてコマンドを実行する「-exec」、実行するコマンド「rm {}」コマンドの終了を表す「\;」を指定すると、findコマンドにより検索された空のファイルが削除される。
rm | 実行するコマンド |
{} | findの検索結果に置き換えられる部分 |
\; | コマンドの終了(エスケープ文字「\」と終了記号「;」) |
「{}」は、findの検索結果のファイル名で置き換えられる。「\」は、シェルが「;」を解釈するのを防ぐためのエスケープ文字で、「;」までがコマンド部分である。。
一度にコマンドを実行せずに、コマンドの実行許可を逐次求めながら行うには、「-exec」の代わりに「-ok」を指定する。コマンドを実行する場合は「y」、実行せずにスキップする場合は「n」を入力する。
findコマンドでディレクトリと検索オプションを指定する$ find . -type f -empty -ok rm {} \; < rm ... ./dirx/file2 > ? y
オプション | 意 味 | |
---|---|---|
-type | 検索対象の種類を指定する | |
f | 検索対象の種類がファイルであることを示す引数 | |
-empty | 検索対象が空(サイズが0) | |
-exec | 検索結果を引数としてコマンドを実行する | |
-ok | コマンド実行時に逐次実行許可を求める |
$ rm -f file3.txt
rmコマンドで-fオプションを指定して削除するファイル「file3.txt」を指示すると、確認を求めずに直ちに「file3.txt」が削除される。ファイルに書き込み許可がない場合でも何の問い合わせもない。
rmコマンドのオプション | |
オプション | 意 味 |
---|---|
-f | 削除の確認なしに強制削除する |
$ rm -i file2.txt rm: remove 通常ファイル `file2.txt'? y
rmコマンドで-iオプションを指定して削除するファイル「file2.txt」を指示すると、削除する前に確認を求められ、「y」[Return]を入力すれば「file2.txt」が削除される。「n」[Return]を入力すれば「file2.txt」は削除されない。
rmコマンドのオプション | |
オプション | 意 味 |
---|---|
-i | 削除の確認を求める |
$ find . -name \*~ -exec rm {} \;
findコマンドで、検索するディレクトリ「.」検索対象がファイル名であることを示す「-name」検索するファイル名「\*~」、検索結果を引数としてコマンドを実行する「-exec」、実行するコマンド「rm {}」コマンドの終了を表す「\;」を指定すると、findコマンドにより検索されたファイルが削除される。意図しないファイルを削除しないために、事前に同じ条件で検だけ実行して確認しておくとよい。
rm | 実行するコマンド |
{} | findの検索結果に置き換えられる部分 |
\; | コマンドの終了(エスケープ文字「\」と終了記号「;」) |
「{}」は、findの検索結果のファイル名で置き換えられる。「\」は、シェルが「;」を解釈するのを防ぐためのエスケープ文字で、「;」までがコマンド部分である。。
一度にコマンドを実行せずに、コマンドの実行許可を逐次求めながら行うには、「-exec」の代わりに「-ok」を指定する。コマンドを実行する場合は「y」、実行せずにスキップする場合は「n」を入力する。
findコマンドでディレクトリと検索オプションを指定する$ find . -name \*~ -ok rm {} \; < rm ... ./work/cat/a.txt~ > ? y < rm ... ./work/cat/b.txt~ > ? n < rm ... ./work/cat/c.txt~ > ? y < rm ... ./work/cat/e.txt~ > ? n < rm ... ./work/file3.txt~ > ? n < rm ... ./work/dir2/dir2_1/file1~ > ? n < rm ... ./work/dir3/file3.txt~ > ? n < rm ... ./work/cut/List3~ > ? n < rm ... ./work/cut/hdni1.txt~ > ? n < rm ... ./work/cut/hdni2.txt~ > ? n < rm ... ./work/cut/hdni3.txt~ > ? n < rm ... ./work/cut/hdni4.txt~ > ? y < rm ... ./work/cut/hdni1-.txt~ > ? n
オプション | 意 味 |
---|---|
-name | 検索対象をファイル名で指定する |
-exec | 検索結果を引数としてコマンドを実行する |
-ok | コマンド実行時に逐次実行許可を求める |
$ ls IMG0006.JPG IMG0012.JPG IMG0017.JPG IMG0171.JPG IMG0280.JPG IMG0009.JPG IMG0015.JPG IMG0134.JPG IMG0263.JPG IMG0294.JPG
$ rm IMG02??.JPG
rmコマンドで、削除するファイルを「IMG02??.JPG」と指定すると、200番台のファイルが削除される。
lsコマンドで実行結果を確認する$ ls IMG0006.JPG IMG0012.JPG IMG0017.JPG IMG0171.JPG IMG0009.JPG IMG0015.JPG IMG0134.JPG
ワイルドカードの「?」は、任意の1文字を意味するので、「IMG02??.JPG」は「IMG02」の後の「??」の場所に任意の文字が2文字あるファイルを意味する。であるから、「IMG0200.JPG」のように数字が入ってもよいし「IMG02AB.JPG」のようにアルファベットが入ってもよい。このディレクトリにあるファイルでは、「IMG0263.JPG」「IMG0280.JPG」「IMG0294.JPG」の3つのファイルが該当する。
目的のファイルを正しく指定するために、lsコマンドでファイルの指定方法を試してみる。
lsコマンドでファイルを指定する$ ls IMG02??.JPG IMG0263.JPG IMG0280.JPG IMG0294.JPG
$ ls IMG0029.jpg IMG0083.jpg IMG0142.jpg IMG0175.jpg IMG0211.jpg IMG0029.tiff IMG0083.tiff IMG0142.tif IMG0175.tif IMG0211.tif
$ rm *.ti*
rmコマンドでファイルを「*.ti*」と指定すると、拡張子が「.tif」と「.tiff」のファイルが削除される。
ファイルを「*.tif*」と指定しても同様の結果が得られる。
$ ls IMG0029.jpg IMG0083.jpg IMG0142.jpg IMG0175.jpg IMG0211.jpg
ワイルドカードの「*」は、0文字以上の任意の文字を意味するため、1文字目の「*」はすべてのファイル名を指定し、後の「.ti*」は拡張子の「.ti」以降にどのような文字がきてもよいことを意味する。「*」の場合は0文字以上なので、「.ti」以降が0文字の「.ti」にも5文字の「.tiffany」にもマッチする。しかし、このディレクトリには拡張子が「.jpg」と「.tif」と「.tiff」しかないので、「.tif」と「.tiff」だけにマッチする。
目的のファイルを正しく指定するために、lsコマンドでファイルの指定方法を試してみる。
$ ls *.ti* IMG0029.tiff IMG0083.tiff IMG0142.tif IMG0175.tif IMG0211.tif $ ls *.tif* IMG0029.tiff IMG0083.tiff IMG0142.tif IMG0175.tif IMG0211.tif
ファイルを「*.ti*」あるいは「*.tif*」と指定すると、拡張子が「.tif」と「.tiff」のファイルがすべて表示される。
$ ls IMG0029.jpg IMG0083.jpg IMG0142.jpg IMG0175.jpg IMG0211.jpg IMG0029.tiff IMG0083.tiff IMG0142.tif IMG0175.tif IMG0211.tif
$ rm *.jpg
rmコマンドで削除するファイルを「*.jpg」と指定すると、拡張子が「jpg」のファイルがすべて削除される。
lsコマンドで実行結果を確認する$ ls IMG0029.tiff IMG0083.tiff IMG0142.tif IMG0175.tif IMG0211.tif
アスタリスク「*」は、0文字以上の任意の文字列を意味するメタキャラクタで、ワイルドカードと呼ばれる。シェルがこれを解釈してコマンドを実行する。
最初の「*」は、ファイル名の本体がどのような名前でもよいことを意味し、「.jpg」は拡張子を「jpg」に特定している。つまり、「ファイル名.拡張子」型のファイルで拡張子に「jpg」を持つファイルを意味する。
目的のファイルを正しく指定するために、lsコマンドでファイルの指定方法を試してみる。
$ ls *.jpg IMG0029.jpg IMG0083.jpg IMG0142.jpg IMG0175.jpg IMG0211.jpg
ファイルを「*.jpg」と指定すると、拡張子が「.jpg」のファイルがすべて表示される。
$ rm file1.txt file2.txt file3.txt
rmコマンドに続いて、削除したいファイルを複数指定すると、1度にそれらのファイルを削除することができる。ただし、これらのファイル名を正確に入力しなくてはならない。