Gentooの創設者によるLinuxの基本。 パート1(3/4):リンク、およびファイルとディレクトリの削除

マニュアルの最初の部分の翻訳からの3番目のパッセージ。 前: firstsecond

この文章では、ハードリンクとシンボリックリンクを調べ、rmコマンドとrmdirコマンドを使用してファイルとディレクトリの削除を削除します。

ファイルのリンクと削除


ハードリンク


ディレクトリ(名前)とiノード(ファイルシステムの基になるインデックス番号)の関係については、「リンク」という用語については既に言及しましたが、気づきません。 Linuxには通常、2種類のリンクがあります。 前に説明したタイプは、ハードリンクと呼ばれます。 各iノードには、任意の数のハードリンクを設定できます。 最後のハードリンクが破壊され、1つのプログラムがファイルを開いたままにしない場合、Linuxは自動的にファイルを削除します。 新しいハードリンクは、lnコマンドを使用して作成できます。



 $ cd /tmp 
$ touch firstlink
$ ln firstlink secondlink
$ ls -i firstlink secondlink
15782 firstlink 15782 secondlink

ご覧のとおり、ハードリンクはinodeレベルで機能し、特定のファイルを示します。 Linuxシステムでは、ハードリンクにいくつかの制限があります。 特に、ディレクトリではなく、ファイルに対してのみハードリンクを作成できます。 はい、そうです。 「。」 および「..」は、システムがディレクトリに作成するハードリンクであり、ユーザー(rootユーザーであっても)を作成することはできません。 ハードリンクの2番目の制限は、複数のファイルシステムをリンクできないことです。 これは、 / usr / bin / bashから/ bin / bashへのハードリンクを作成できず、ディレクトリ// usrが異なるファイルシステム上にある場合(セクション-およそトランス)を作成できないことを意味します。



シンボリックリンク


実際には、シンボリックリンク(または英語のシンボリックリンク、場合によっては「シンボリックリンク」)がハードリンクよりもはるかに頻繁に使用されます。 Simlinksは、iノード番号ではなく、名前で他のファイルを参照する特別なタイプのファイルです。 削除されたファイルは保存されません。 リンクが指すファイルが消えると、シンボリックリンクが機能しなくなり、壊れます。



シンボリックリンクを作成するには、-sオプションをlnに渡します。



 $ ln -s secondlink thirdlink 
$ ls -l firstlink secondlink thirdlink
-rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 firstlink -rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 secondlink lrwxrwxrwx 1 agriffis agriffis 10 Dec 31 19:39 thirdlink -> secondlink

ls -l出力では、3つの方法でシンボリックリンクを区別できます。 最初に、最初の列の文字lに注意してください。 第二に、シンボリックリンクのサイズは、その中の文字数に等しくなります(この例ではsecondlink )。 3番目に、出力の最後の列は、直観的な表記 "->"を使用して、リンクの先を示しています。



Simlinkの詳細


通常、シンボリックリンクはハードリンクよりも柔軟です。 ディレクトリを含む任意のファイルシステムオブジェクトへのシンボリックリンクを作成できます。 また、それらの実装は(iノードではなく)パスに基づいているため、別のファイルシステムのオブジェクトを指すシンボリックリンクを自由に作成できます。 ただし、この事実は、それらを理解することも困難にします。



/ usr / local / binを指すリンクを/ tmpに作成するとします。 ダイヤルする必要があります:



 $ ln -s /usr/local/bin bin1 
$ ls -l bin1
lrwxrwxrwx 1 root root 14 Jan 1 15:42 bin1 -> /usr/local/bin

または、代替オプション:



 $ ln -s ../usr/local/bin bin2 
$ ls -l bin2
lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin

ご覧のとおり、両方のシンボリックリンクは同じディレクトリを指します。 ただし、2番目のシンボリックリンクが別のディレクトリに移動されると、パスの相対的な性質により壊れる可能性があります。



 $ ls -l bin2 
lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin
$ mkdir mynewdir
$ mv bin2 mynewdir
$ cd mynewdir
$ cd bin2
bash: cd: bin2: No such file or directory
$ ls -l bin2
lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin
$ mkdir mynewdir
$ mv bin2 mynewdir
$ cd mynewdir
$ cd bin2
bash: cd: bin2: No such file or directory


ディレクトリ/ tmp / usr / local / binが存在しないため、 bin2に移動できなくなりました 。 つまり、 bin2が壊れています。



このため、相対パス情報とのリンクを回避することをお勧めします。 ただし、相対シンボリックリンクが非常に便利な場合が多くあります。 / usr / binにプログラムの代替名を作成する例を考えてみましょう。



 # ls -l /usr/bin/keychain 
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain

スーパーユーザーの代わりに、 kcなどのkeychainの短い同義語が必要です。 この例では、bashグリーティングが「#」に変更されたことから明らかなように、ルートアクセス権があります。 通常のユーザーには/ usr / binにファイルを作成する権限がないため、rootアクセスが必要です。 スーパーユーザーに代わって、次のようにキーチェーンの代替名を作成できます。



 # cd /usr/bin 
# ln -s /usr/bin/keychain kc
# ls -l keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain
# ls -l kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain
# cd /usr/bin
# ln -s /usr/bin/keychain kc
# ls -l keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain
# ls -l kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain
 # cd /usr/bin 
# ln -s /usr/bin/keychain kc
# ls -l keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain
# ls -l kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain

この例では、 / usr / bin / keychainファイルを指すkcというシンボリックリンクを作成しました。



これまでのところ、この解決策は機能しますが、両方のファイル/ usr / bin / keychain/ usr / bin / kc/ usr / local / binに移動する場合、問題が発生します。



 # mv /usr/bin/keychain /usr/bin/kc /usr/local/bin 
# ls -l /usr/local/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain
# mv /usr/bin/keychain /usr/bin/kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain
 # mv /usr/bin/keychain /usr/bin/kc /usr/local/bin 
# ls -l /usr/local/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain

kcシンボリックリンクに絶対パスを使用したので、 / usr / bin / keychain/ usr / local / binに移動したため存在しなかった/ usr / bin / keychainを引き続き参照しています。



これは、klink simlinkが現在機能していないという事実につながりました。 シンボリックリンクの相対パスと絶対パスの両方に利点があり、タスクによっては、適切なタイプのパスを使用する必要があります。 多くの場合、相対パスと絶対パスの両方が同様に機能します。 以下の例は、両方のファイルを移動した後でも機能します。



 # cd /usr/bin 
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc -> keychain
# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> keychain
# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc -> keychain
# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> keychain
 # cd /usr/bin 
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc -> keychain
# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> keychain
# cd /usr/bin
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc -> keychain
# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> keychain
 # cd /usr/bin 
# ln -s keychain kc
# ls -l kc
lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc -> keychain
# mv keychain kc /usr/local/bin
# ls -l /usr/local/bin/keychain
-rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain
# ls -l /usr/local/bin/kc
lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> keychain

これで、 / usr / local / bin / kcと入力してキーチェーンプログラムを実行できます。 / usr / local / bin / kcは、 kcが配置されているのと同じディレクトリ内のキーチェーンプログラムを指します。



rm


したがって、cp、mv、およびlnの使用方法はわかっています。次は、ファイルシステムからオブジェクトを削除する方法について学習します。 これは通常、rmコマンドを使用して行われます。 ファイルを削除するには、コマンドラインで指定するだけです。



 $ cd /tmp 
$ touch file1 file2
$ ls -l file1 file2
-rw-r--r-- 1 root root 0 Jan 1 16:41 file1 -rw-r--r-- 1 root root 0 Jan 1 16:41 file2
$ rm file1 file2
$ ls -l file1 file2
ls: file1: No such file or directory
ls: file2: No such file or directory
$ cd /tmp
$ touch file1 file2
$ ls -l file1 file2
-rw-r--r-- 1 root root 0 Jan 1 16:41 file1 -rw-r--r-- 1 root root 0 Jan 1 16:41 file2
$ rm file1 file2
$ ls -l file1 file2
ls: file1: No such file or directory
ls: file2: No such file or directory


Linuxでは、削除されたファイルは通常、長い間消えてしまうことに注意してください。 したがって、多くの初心者のシステム管理者は、ファイルを削除するときに-iオプションを使用します。 -iオプションは、rmにファイルを対話形式で削除するように指示します-これは、ファイルを削除する前に確認することを意味します。 例:



$ rm -i file1 file2
rm: remove regular empty file `file1'? y
rm: remove regular empty file `file2'? y


上記の例では、rmコマンドは、指定された各ファイルを削除する確認を求めます。 同意したら、「y」と入力してEnterキーを2回押す必要がありました。 「n」を入力した場合、ファイルはそのまま残ります。 または、何か間違ったことをした場合、Control-Cを押して、完全なrm -iコマンドをリセットすることができます。これは、システムに損傷を与える前のことです。



rmコマンドの使用方法をまだ学習している場合は、お気に入りのテキストエディターで〜/ .bashrcファイルに次の行を追加してから、ログアウトして再度ログインすると便利です。 その後、rmと入力するたびに、bashシェルは自動的にrm -iコマンドに変換します。 この方法でrmは常にインタラクティブに動作します:



alias rm="rm -i"

rmdir


ディレクトリを削除するには、2つのオプションがあります。 ディレクトリ内のすべてのオブジェクトを削除してから、rmdirを使用してディレクトリ自体を削除できます。



$ mkdir mydir
$ touch mydir/file1
$ rm mydir/file1
$ rmdir mydir


この方法は、一般的に「吸盤のディレクトリを削除する方法」として知られています。 この場合、 ユーザーの犬を食べるすべての本物の少年と第一人者の管理者は、以下で説明するはるかに便利なrm -rfコマンドを使用します。



ディレクトリを削除する最良の方法は、rmコマンドの「再帰的強制」オプションを使用して、指定されたディレクトリとその中に含まれるオブジェクトを削除するように指示することです。



$ rm -rf mydir

通常、ディレクトリツリーを削除するには、rm -rfが最も好ましい方法です。 rm -rfを使用するときは、その力を善と悪の両方で使用できるため、非常に注意してください。 =)



継続するには...



著者について


ダニエル・ロビンス


Daniel Robbinsは、Gentooコミュニティの創設者であり、Gentoo Linuxオペレーティングシステムの作成者です。 ダニエルは妻のメアリーと元気な娘2人とニューメキシコに住んでいます。 彼はFuntooの創設者兼代表でもあり、 IBM developerWorks 、Intel Developer Services、およびC / C ++ Users Journalの技術記事を数多く執筆しています。



クリス・ハウザー


クリスハウザーは、1994年にテイラー大学(米国インディアナ州)の管理者チームに参加し、コンピューターサイエンスと数学の学士号を取得して以来、UNIXサポーターです。 その後、Webアプリケーション、ビデオ編集、UNIXドライバー、暗号化保護など、さまざまな分野で働きました。 現在、Sentry Data Systemsで働いています。 Chrisは、Gentoo LinuxやClojureなどの多くの無料プロジェクトにも貢献し、 The Joy of Clojureの共同執筆者でもあります。



アロン・グリフィス


Iron Griffisはボストンに住んでおり、ここ10年間、Hewlett-PackardでTru64、Linux、Xen、KVM仮想化セキュリティ認証用のUNIXネットワークドライバー、最近ではHP ePrintプラットフォームなどのプロジェクトに従事しました。 プログラミングの暇な時間に、Ayronは、自転車に乗ったり、ビットをジャグリングしたり、ボストンのプロ野球チームRed Socksを応援したりする際に、プログラミングの問題を消し去ることを好みます。

Source: https://habr.com/ru/post/J99653/


All Articles