2.4 レッスン 1
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
2 Linuxでのやりかたを見つける |
Objective: |
2.4 ファイルの作成、移動、削除 |
Lesson: |
1 of 1 |
はじめに
このレッスンでは、Linuxのコマンドラインツールを使用して、ファイルとディレクトリを管理する方法を学びます。
ファイルは、名前と属性のセットを持つデータのコレクションです。たとえば、携帯電話からコンピュータに写真を転送して、わかりやすい名前を付けると、コンピュータ上に多数の画像ファイルができます。これらのファイルには、最後にアクセスおよび変更された時刻などの属性が付けられます。
ディレクトリとは、ファイルの整理に使用する特別なファイルです。ディレクトリを例えると、ファイルキャビネットに書類を整理する際の、ファイルフォルダ(バインダー)のようなものです。紙のファイルフォルダとは異なり、ディレクトリ内に別のディレクトリを配置することができます。
コマンドラインは、Linuxシステムでファイルを管理する最も効果的な方法です。シェルおよびコマンドラインツールには、グラフィカルなファイルマネージャーよりも、速く効果的に使用できる機能を備えています。
このセクションでは、ファイルやディレクトリを管理するために、ls
、mv
、cp
、pwd
、find
、touch
、rm
、rmdir
、echo
、cat
、mkdir
といったコマンドを使用していきます。
大文字・小文字の区別
Microsoft Windowsとは異なり、Linuxシステムでは、ファイルやディレクトリの名前で大文字・小文字が区別されます(訳注: case sensitiveという)。つまり、/etc/
ディレクトリと /ETC/
ディレクトリは異なります。次のコマンドを試してみましょう:
$ cd / $ ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr $ cd ETC bash: cd: ETC: No such file or directory $ pwd / $ cd etc $ pwd /etc
pwd
コマンドは、現在のディレクトリを表示します。例では、/ETC
ディレクトリへの移動が、そのようなディレクトリは無いと言う理由で失敗しています。対して、存在する /etc
ディレクトリへの移動は成功しました。
ディレクトリの作成
ディレクトリを作成するには、mkdir
コマンドを使用します。
ホームディレクトリに新しいディレクトリを作成してみましょう:
$ cd ~ $ pwd /home/user $ ls Desktop Documents Downloads $ mkdir linux_essentials-2.4 $ ls Desktop Documents Downloads linux_essentials-2.4 $ cd linux_essentials-2.4 $ pwd /home/emma/linux_essentials-2.4
このレッスンでは、このディレクトリないしサブディレクトリのひとつでコマンドを実行します。
ファイルシステムのどこに居たとしても、レッスン用のディレクトリに簡単に戻るには、次のコマンドを使います:
$ cd ~/linux_essentials-2.4
シェルは、文字 ~
を、自分のホームディレクトリと解釈します。
レッスン用ディレクトリに移動したら、演習で使用するディレクトリをいくつか作成します。mkdir
コマンドに、スペースで区切ってすべてのディレクトリ名を指定します:
$ mkdir creating moving copying/files copying/directories deleting/directories deleting/files globs mkdir: cannot create directory ‘copying/files’: No such file or directory mkdir: cannot create directory ‘copying/directories’: No such file or directory mkdir: cannot create directory ‘deleting/directories’: No such file or directory mkdir: cannot create directory ‘deleting/files’: No such file or directory $ ls creating globs moving
エラーメッセージと、moving
、globs
、および creating
のみが作成されたことに着目しましょう。copying
と deleting
ディレクトリは、まだ存在しません。デフォルトでは、mkdir
は、存在しないディレクトリ内にディレクトリを作成しません。mkdir
に -p
または --parents
オプションを指定すると、親ディレクトリが存在しない場合にはそれを作成することを指示します。今度は -p
オプションを付けて、同じ mkdir
コマンドを実行しましょう:
$ mkdir -p creating moving copying/files copying/directories deleting/directories deleting/files globs
今度は、エラーメッセージは表示されませんでした。どのディレクトリが作成されたかを確認してみましょう:
$ find . ./creating ./moving ./globs ./copying ./copying/files ./copying/directories ./deleting ./deleting/directories ./deleting/files
find
プログラムは通常、ファイルやディレクトリの検索に使用しますが、オプションを指定しないと、現在のディレクトリのすべてのファイル、ディレクトリ、およびサブディレクトリをリスト表示します。
Tip
|
|
ファイルの作成
通常、ファイルは、そのデータを処理するプログラムによって作成されます。touch
コマンドを使用すると、空のファイルを作成できます。既存のファイルに対して touch
を実行すると、ファイルの内容は変更されませんが、ファイルの変更時刻を示すタイムスタンプが更新されます。
以下のコマンドを実行して、グロビング(globbing)のレッスンで使用するファイルを作成しましょう。
$ touch globs/question1 globs/question2012 globs/question23 globs/question13 globs/question14 $ touch globs/star10 globs/star1100 globs/star2002 globs/star2013
globs
ディレクトリにすべてのファイルが作成されたことを確認してみましょう:
$ cd globs $ ls question1 question14 question23 star1100 star2013 question13 question2012 star10 star2002
touch
はどのようなファイルを作成したのでしょうか? cat
コマンドを使うと、テキストファイルの内容を見ることができます。作成したばかりのファイルの1つで試してみましょう。
$ cat question14
touch
は空のファイルを作成するので、何も出力されません。 echo
コマンドと >
を組み合わせることで、サンプルのテキストファイルを作成できます。やってみましょう:
$ echo hello > question15 $ cat question15 hello
echo
はコマンドラインにテキストを表示します。 文字 >
は、端末ではなく指定されたファイルにコマンドの出力を書き込むことを、シェルに指示します。この場合、echo
の出力(この場合は hello
)がファイル question15
に書き込まれます。この機能は echo
だけのものではなく、任意のコマンドで使用できます。
Warning
|
文字 |
ファイル名の変更(リネーム)
mv
コマンドを使うと、ファイルを移動したり名前を変更する事ができます。
作業ディレクトリを moving
ディレクトリに変更しましょう:
$ cd ~/linux_essentials-2.4/moving
練習用のファイルをいくつか作りましょう。もうこれらのコマンドはお馴染みですね。
$ touch file1 file22 $ echo file3 > file3 $ echo file4 > file4 $ ls file1 file22 file3 file4
file22
は、file2
のタイポでした。mv
コマンドで修正しましょう。リネーム(ファイル名の変更)を行う場合、最初の引数は現在の名前で、2つめの引数は新しい名前です。
$ mv file22 file2 $ ls file1 file2 file3 file4
mv
コマンドは注意深く使いましょう。あるファイルの名前を、既存のファイルと同じ名前に変更しようとすると、上書きしてしまいます。file3
と file4
で試してみましょう:
$ cat file3 file3 $ cat file4 file4 $ mv file4 file3 $ cat file3 file4 $ ls file1 file2 file3
file3
の内容が、file4
になっています。-i
オプションを指定すると、mv
は既存のファイルを上書きするかどうかを尋ねます。
$ touch file4 file5 $ mv -i file4 file3 mv: overwrite ‘file3’? y
ファイルの移動
mv
コマンドで、ファイルをあるディレクトリから別のディレクトリに移動することができます。
ファイルの移動先となるディレクトリをいくつか作りましょう:
$ cd ~/linux_essentials-2.4/moving $ mkdir dir1 dir2 $ ls dir1 dir2 file1 file2 file3 file5
file1
を dir1
に移動します:
$ mv file1 dir1 $ ls dir1 dir2 file2 file3 file5 $ ls dir1 file1
mv
の最後の引数が、宛先ディレクトリであることに注意しましょう。最後の引数がディレクトリであるときは、ファイルがその中に移動されます。1つの mv
コマンドで、複数のファイルを指定することができます。
$ mv file2 file3 dir2 $ ls dir1 dir2 file5 $ ls dir2 file2 file3
mv
を使って、ディレクトリの名前を変更したり、移動することもできます。dir1
の名前を dir3
に変更してみましょう:
$ ls dir1 dir2 file5 $ ls dir1 file1 $ mv dir1 dir3 $ ls dir2 dir3 file5 $ ls dir3 file1
ファイルやディレクトリの削除
rm
コマンドで、ファイルやディレクトリを削除することができます。対して、rmdir
コマンドはディレクトリのみを削除することができます。file5
を削除して、moving
ディレクトリをお掃除しましょう:
$ cd ~/linux_essentials-2.4/moving $ ls dir2 dir3 file5 $ rmdir file5 rmdir: failed to remove ‘file5’: Not a directory $ rm file5 $ ls dir2 dir3
rmdir
は、デフォルトでは空のディレクトリしか削除できませんから、通常ファイルを削除するには rm
を使わねばなりません。deleting
ディレクトリを削除してみましょう:
$ cd ~/linux_essentials-2.4/ $ ls copying creating deleting globs moving $ rmdir deleting rmdir: failed to remove ‘deleting’: Directory not empty $ ls -l deleting total 0 drwxrwxr-x. 2 emma emma 6 Mar 26 14:58 directories drwxrwxr-x. 2 emma emma 6 Mar 26 14:58 files
rmdir
は、デフォルトでは空ではないディレクトリの削除を拒否します。deleting
ディレクトリにある空のサブディレクトリを、rmdir
で 削除します:
$ ls -a deleting/files . .. $ rmdir deleting/files $ ls -l deleting directories
多くのサブディレクトリやファイルがある深いディレクトリ構造を削除するのは面倒に思えるかもしれませんが、実際には簡単です。 rm
は、デフォルトでは通常のファイルのみを削除しますが、-r
オプションでこの動作を変更できます。 rm -r
は優れたフットガン(訳注: 足撃ち銃/強力な道具だが、悲惨なミスを起こしやすいものの意)です。rm
に -r
オプションを指定すると、ディレクトリだけではなく、そのディレクトリにあるすべてのサブディレクトリやその内容を削除します。 rm -r
がどのように機能するかを、確認しておきましょう:
$ ls copying creating deleting globs moving $ rm deleting rm: cannot remove ‘deleting’: Is a directory $ ls -l deleting total 0 drwxrwxr-x. 2 emma emma 6 Mar 26 14:58 directories $ rm -r deleting $ ls copying creating globs moving
空ではなかったのに、deleting
が無くなったことに注意しましょう。mv
や rm
と同様に、-i
オプションを指定すると、処理を行う前に確認してきます。もう必要が無くなったので、rm -ri
を使って、moving
を削除します:
$ find . ./creating ./moving ./moving/dir2 ./moving/dir2/file2 ./moving/dir2/file3 ./moving/dir3 ./moving/dir3/file1 ./globs ./globs/question1 ./globs/question2012 ./globs/question23 ./globs/question13 ./globs/question14 ./globs/star10 ./globs/star1100 ./globs/star2002 ./globs/star2013 ./globs/question15 ./copying ./copying/files ./copying/directories $ rm -ri moving rm: descend into directory ‘moving’? y rm: descend into directory ‘moving/dir2’? y rm: remove regular empty file ‘moving/dir2/file2’? y rm: remove regular empty file ‘moving/dir2/file3’? y rm: remove directory ‘moving/dir2’? y rm: descend into directory ‘moving/dir3’? y rm: remove regular empty file ‘moving/dir3/file1’? y rm: remove directory ‘moving/dir3’? y rm: remove directory ‘moving’? y
ファイルやディレクトリをコピーする
ファイルやディレクトリをコピーするには、cp
コマンドを使用します。copying
ディレクトリに、いくつかのファイルをコピーしましょう:
$ cd ~/linux_essentials-2.4/copying $ ls directories files $ cp /etc/nsswitch.conf files/nsswitch.conf $ cp /etc/issue /etc/hostname files
最後の引数がディレクトリの場合、cp
は前の引数に指定したファイルのコピーをディレクトリ内に作成します。mv
と同様に、ターゲット(宛先)がディレクトリであれば、複数のファイルを一度に指定できます。
cp
の両方の引数がファイルであり、両方のファイルが存在する場合、cp
は1番目のファイルの内容で2番目のファイルを上書きします。hostname
ファイルで issue
ファイルを上書きしてみましょう:
$ cd ~/linux_essentials-2.4/copying/files $ ls hostname issue nsswitch.conf $ cat hostname mycomputer $ cat issue Debian GNU/Linux 9 \n \l $ cp hostname issue $ cat issue mycomputer
続いて、files
ディレクトリのコピーを、directories
ディレクトリにコピーしてみましょう:
$ cd ~/linux_essentials-2.4/copying $ cp files directories cp: omitting directory ‘files’ (訳注: ディレクトリ `files`は除外)
このように、cp
はデフォルトでは、個々のファイルしか扱いません。ディレクトリをコピーするには、-r
オプションを使用します。-r
オプションを使うと、cp
はコピー対象のディレクトリの内容もコピーします。
$ cp -r files directories $ find . ./files ./files/nsswitch.conf ./files/fstab ./files/hostname ./directories ./directories/files ./directories/files/nsswitch.conf ./directories/files/fstab ./directories/files/hostname
コピー先のディレクトリが存在している場合、cp
はコピー元のディレクトリのコピーを、宛先のディレクトリの中に作成することに注意しましょう。宛先のディレクトリが存在していない場合は、その(宛先の)ディレクトリを作成してから、コピー元ディレクトリの内容をそこにコピーします。
$ cp -r files files2 $ find . ./files ./files/nsswitch.conf ./files/fstab ./files/hostname ./directories ./directories/files ./directories/files/nsswitch.conf ./directories/files/fstab ./directories/files/hostname ./files2 ./files2/nsswitch.conf ./files2/fstab ./files2/hostname
グロビング(globbing)
Linuxでは、単純なパターンマッチング言語を グロビング と呼んでいます。Linuxシステムのコマンドラインシェルは、この言語を使用して、ファイル名が特定のパターンに一致するファイルのグループを参照します。POSIX.1-2017という規格で、次のパターンマッチング文字を定義しています。(訳注: 単純に「グロブ」と呼ぶこともあります)
*
-
任意の数(ゼロを含む)の文字と一致します
?
-
任意の1文字と一致します
[]
-
文字のクラスに一致します
これは、英語の正確な文字列を指定するのではなく、一致するパターンを使ってシェルに指示することができることを意味します。Linuxにおいては、それぞれのファイル名をタイプする代わりに、複数のファイルを指示するために使用します。以下のコマンドを試してみましょう:
$ cd ~/linux_essentials-2.4/globs $ ls question1 question14 question2012 star10 star2002 question13 question15 question23 star1100 star2013 $ ls star1* star10 star1100 $ ls star* star10 star1100 star2002 star2013 $ ls star2* star2002 star2013 $ ls star2*2 star2002 $ ls star2013* star2013
シェルは *
を任意の数の文字に展開するので、star*
は現在のディレクトリからの相対パスが star
で始まるすべてのファイル/ディレクトリを意味することになります。ls star*
を実行したときには、ls
コマンドに start*
という引数が与えられるのではなく、現在のディレクトリにあるファイルからパターン star*
に一致するもの(star
自体も含まれます)を探して、一致したそれぞれのファイルを ls
の引数とします:
$ ls star*
この ls
コマンドは、以下と同じです:
$ ls star10 star1100 star2002 star2013
ls
に文字 *
が伝わることはありません。次のコマンドで確認してみましょう:
$ ls star\* ls: cannot access star*: No such file or directory
文字の前に \
を置くと、その文字の特別な意味を解釈しないようにシェルに指示することになります。この例では、star*
をグロブせずに、ls
に引数 star*
を渡しています。
文字 ?
は、1文字に展開されます。次のコマンドを実行してみてください:
$ ls question1 question14 question2012 star10 star2002 question13 question15 question23 star1100 star2013 $ ls question? question1 $ ls question1? question13 question14 question15 $ ls question?3 question13 question23 $ ls question13? ls: cannot access question13?: No such file or directory
カギ括弧 [ ]
は、文字の範囲あるいはクラスへの一致を表わします。カギ括弧 [ ]
は、POSIXの正規表現と同じように機能しますが、 文字 !
の代わりにグラブでは文字 ^
を使用します。
練習用にいくつかのファイルを作りましょう:
$ mkdir brackets $ cd brackets $ touch file1 file2 file3 file4 filea fileb filec file5 file6 file7
カギ括弧 [ ]
で範囲を示すには、文字 -
を使います:
$ ls file1 file2 file3 file4 file5 file6 file7 filea fileb filec $ ls file[1-2] file1 file2 $ ls file[1-3] file1 file2 file3
複数の範囲を指定することができます。
$ ls file[1-25-7] file1 file2 file5 file6 file7 $ ls file[1-35-6a-c] file1 file2 file3 file5 file6 filea fileb filec
カギ括弧は、一群の文字との一致にも使えます。
$ ls file[1a5] file1 file5 filea
指定した文字 以外 との一致を示すためには、文字 ^
を先頭に置きます。
$ ls file[^a] file1 file2 file3 file4 file5 file6 file7 fileb filec
このレッスンの最後に、 文字クラス を取り上げます。文字クラスへの一致には、[:クラス名:]
を使います。例えば、数字(digit)クラスを使うには、次のようにします:
$ ls file[[:digit:]] file1 file2 file3 file4 file5 file6 file7 $ touch file1a file11 $ ls file[[:digit:]a] file1 file2 file3 file4 file5 file6 file7 filea $ ls file[[:digit:]]a file1a
グロブ file[[:digit:]a]
は、file
に続いて数字ないしは a
があるものと一致します。
サポートされる文字クラスは、システムの現在のロケール(地域設定)によって異なります。POSIX規格では、以下の文字クラスは、すべてのロケールにおいて利用可能です。
[:alnum:]
-
アルファベットと数字。
[:alpha:]
-
大文字・小文字の文字。
[:blank:]
-
スペース(空白)とタブ。
[:cntrl:]
-
制御文字(control characters)、例えばバックペース、ベル、NAK、エスケープなど。
[:digit:]
-
数字(
0123456789
)。 [:graph:]
-
図形文字(制御文字と空白文字を除くすべての文字)。
[:lower:]
-
アルファベットの小文字(
a-z
)。 [:print:]
-
表示可能な文字(
alnum
、punct
、および空白文字)。 [:punct:]
-
句読点。すなわち、
!
、&
、"
。 [:space:]
-
空白文字。すなわち、タブ、スペース、改行。
[:upper:]
-
アルファベットの小文字(
A-Z
)。 [:xdigit:]
-
16進数での数字(通常は
0123456789abcdefABCDEF
)。
演習
-
以下の場合に、コマンド
mkdir -p /tmp/outfiles/text/today /tmp/infiles/text/today
で作成されるディレクトリはどれでしょうか?$ pwd /tmp $ find . ./outfiles ./outfiles/text
/tmp
/tmp/outfiles
/tmp/outfiles/text
/tmp/outfiles/text/today
/tmp/infiles
/tmp/infiles/text
/tmp/infiles/text/today
-
mkdir
、rm
、およびcp
において、-v
は何を行いますか? -
1つのコマンドラインで、誤って3つのファイルを、既存のディレクトリではなく1つのファイルにコピーすると、何が起きますか?
-
mv
コマンドで、ディレクトリをそれ自体に移動しようとすると何が起きますか? -
現在のディレクトリから、すべての
old
で始まるファイルを削除するにはどうしますか? -
次のファイルの内、
log_[a-z]_201?_*_01.txt
に一致するものはどれでしょう?log_3_2017_Jan_01.txt
log_+_2017_Feb_01.txt
log_b_2007_Mar_01.txt
log_f_201A_Wednesday_01.txt
-
以下のファイル名に一致するグロブをいくつか作りましょう:
doc100 doc200 doc301 doc401
発展演習
-
cp
のmanページを参照して、パーミッションと更新日時が元のファイルと同じファイルにコピーする方法を見つけてください。
-
rmdir -p
コマンドは何を行いますか? 試してみた上で、rm -f
との違いを説明してください。 -
このコマンドを実際に実行してはいけません。
rm -ri /*
を実行するとどうなりますか? (繰り返しますが、このコマンドを実行してはいけません!)。 -
mv
コマンドで、-i
を指定する以外に、宛先ファイルの上書きを禁止することはできますか? -
cp -u
コマンドについて説明してください。
まとめ
Linuxコマンドライン環境には、ファイルを管理するためのツールがあります。cp
、mv
、mkdir
、rm
、rmdir
がよく使用されます。シェルのグロブとこれらのツールと組み合わせると、多くの作業を迅速に行うことができます。
多くのコマンドには -i
オプションがあり、処理を行う前に問い合わせを行います。何かを打ち間違えた場合など、確認を行うことによって多くのやっかい事から守ることができます。
また、多くのコマンドには -r
オプションがあります。多くの場合 -r
オプションは、再帰を意味します。数学とコンピュータサイエンスでは、再帰関数はそれ自体を定義に使用する関数です。コマンドラインツールでは、通常、あるディレクトリとそこに含まれるすべてに、コマンドを適用します。
このレッスンで使用したコマンド:
cat
-
ファイルの内容を読み取って出力します。
cp
-
ファイルやディレクトリをコピーします。
echo
-
文字列を出力します。
find
-
ファイルシステムの木構造を横断して、条件に一致するファイルを探します。
ls
-
ディレクトリの内容をリスト表示したり、ファイルやディレクトリの属性を表示します。
mkdir
-
新しいディレクトリを作成します。
mv
-
ファイルやディレクトリを移動したり、名前を変更します。
pwd
-
現在の作業ディレクトリを出力します。
rm
-
ファイルやディレクトリを削除します。
rmdir
-
ディレクトリを削除します。
touch
-
新しい空のファイルを作成したり、既存ファイルの変更時刻を更新します。
演習の解答
-
以下の場合に、コマンド
mkdir -p /tmp/outfiles/text/today /tmp/infiles/text/today
で作成されるディレクトリはどれでしょうか?$ pwd /tmp $ find . ./outfiles ./outfiles/text
○をしたディレクトリが作成されたものです。ディレクトリ
/tmp
、/tmp/outfiles
、/tmp/outfiles/text
は、すでに存在していたので、mkdir
はそれらを無視します。/tmp
/tmp/outfiles
/tmp/outfiles/text
/tmp/outfiles/text/today
○
/tmp/infiles
○
/tmp/infiles/text
○
/tmp/infiles/text/today
○
-
mkdir
、rm
、およびcp
において、-v
は何を行いますか?一般的に、
-v
は冗長な出力を有効にします。それぞれのプログラムは、実行中の処理について出力します:$ rm -v a b removed 'a' removed 'b' $ mv -v a b 'a' -> 'b' $ cp -v b c 'b' -> 'c'
-
1つのコマンドラインで、誤って3つのファイルを、既存のディレクトリではなく1つのファイルにコピーすると、何が起きますか?
cp
は何も実行せず、エラーメッセージを表示します。$ touch a b c d $ cp a b c d cp: target 'd' is not a directory
-
mv
コマンドで、ディレクトリをそれ自体に移動しようとすると何が起きますか?mv
は、その操作が行えないというエラーメッセージを表示します。$ mv a a mv: cannot move 'a' to a subdirectory of itself, 'a/a'
-
現在のディレクトリから、すべての
old
で始まるファイルを削除するにはどうしますか?rm
でグロブを使用します:$ rm old*
-
次のファイルの内、
log_[a-z]_201?_*_01.txt
に一致するものはどれでしょう?log_3_2017_Jan_01.txt
log_+_2017_Feb_01.txt
log_b_2007_Mar_01.txt
log_f_201A_Wednesday_01.txt
X
$ ls log_[a-z]_201?_*_01.txt log_f_201A_Wednesday_01.txt
順に見ていきましょう。
log_[a-z]
は、log_
に続く任意の小文字に一致しますから、log_f_201A_Wednesday_01.txt
とlog_b_2007_Mar_01.txt
が一致します。さらに、_201?
は_201
に続く任意の1文字に一致しますから、(一致した2つのうち)log_f_201A_Wednesday_01.txt
のみが一致します。最後に、*_01.txt
は、末尾が_01.txt
であるものに一致するので、ここまでの選択はそのまま残ります。 -
以下のファイル名に一致するグロブをいくつか作りましょう:
doc100 doc200 doc301 doc401
いくつもの解決策がありますが、ここではいくつかを示します:
doc* doc[1-4]* doc?0? doc[1-4]0?
発展演習の解答
-
cp
のmanページを参照して、パーミッションと更新日時が元のファイルと同じファイルにコピーする方法を見つけてください。manページから、
-p
オプションを使えば良いことが分かります。$ man cp -p same as --preserve=mode,ownership,timestamps --preserve[=ATTR_LIST] preserve the specified attributes (default: mode,ownership,time‐ stamps), if possible additional attributes: context, links, xattr, all 訳: 指定した属性(デフォルトでは、モード、所有者、タイムスタンプ) を保存します。さらに指定できる属性: context, links, xattr, all
-
rmdir -p
コマンドは何を行いますか? 試してみた上で、rm -f
との違いを説明してください。rmdir
の-p
オプションは、mkdir -p
と同様に動作します。ディレクトリツリーが空になるパスを指定すると、それらすべてを削除します。$ find . ./a ./a/b ./a/b/c $ rmdir -p a/b/c $ ls
-
このコマンドを実際に実行してはいけません。
rm -ri /*
を実行するとどうなりますか? (繰り返しますが、このコマンドを実行してはいけません!)。ログインしているユーザーの権限で書き込み可能な、すべてのファイルやディレクトが削除されてしまいます。その中には、ネットワークファイルシステムも含まれます。
-
mv
コマンドで、-i
を指定する以外に、宛先ファイルの上書きを禁止することはできますか?できます。
-n
ないし--no-clobber
オプションは、mv
による上書きを禁止します。$ cat a a $ cat b b $ mv -n a b $ cat b b
-
cp -u
コマンドについて説明してください。cp
の-u
オプションは、コピー先のファイルが存在しないか、コピー元のファイルより古い場合にのみ、コピーを行います。$ ls -l total 24K drwxr-xr-x 123 emma student 12K Feb 2 05:34 .. drwxr-xr-x 2 emma student 4.0K Feb 2 06:56 . -rw-r--r-- 1 emma student 2 Feb 2 06:56 a -rw-r--r-- 1 emma student 2 Feb 2 07:00 b $ cat a a $ cat b b $ cp -u a b $ cat b b $ cp -u a c $ ls -l total 12 -rw-r--r-- 1 emma student 2 Feb 2 06:56 a -rw-r--r-- 1 emma student 2 Feb 2 07:00 b -rw-r--r-- 1 emma student 2 Feb 2 07:00 c