web-dev-qa-db-ja.com

lnのパラメーターの順序を記憶するためのヒント?

私は何年もlnを使用してシンボリックリンクを記述しましたが、それでもパラメーターの順序が間違っています。

これは通常私に書いています:

ln -s a b

そして、出力を見て自分を思い出させます。

私はいつもa -> b実際に反対のときに読んだようにb -> a。これは直観に反しているように感じるので、私は常に自分自身を推測していることがわかります。

正しい順序を覚えておくためのヒントはありますか?

66
Zhro

私は以下を使用します:lnには引数が1つの形式( manpage にリストされている2番目の形式)があり、ターゲットのみが必要です(どのようにlnが機能するかターゲットをまったく知らずに)およびlnは現在のディレクトリにリンクを作成します。 2つの引数の形式は1つの引数の形式への追加であるため、ターゲットは常に最初の引数です。

41
gary

lncpに似ています。「ソース」が最初に来る必要があります。」

85
Hermann

ほとんどのUnicesはlnコマンドを次のように文書化しています

ln source target

(ここではオプションなどを省略しています)

例:

  • POSIX標準

    ln [-fs] [-L|-P] source_file target_file
    
  • OpenBSD

    ln [-fhLnPs] source [target]
    
  • NetBSD および FreeBSD

    ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] source_file [target_file]
    
  • マックOS

    ln [-Ffhinsv] source_file [target_file]
    
  • Solaris

    /usr/bin/ln [-fns] source_file [target]
    
  • [〜#〜] aix [〜#〜]

    ln [ -f | -n ] [ -s ] SourceFile [ TargetFile ]
    

GNU lnマニュアルはsourcetargettargetリンク名

GNU=単語の選択を無視して、lnユーティリティは、たとえばmvおよびcpと同じ種類のセマンティクスに従いますthetargetは、sourceから作成されるものです。

したがって、

ln -s a b

bを指すシンボリックリンクaを作成します。

symbolicリンクを作成する場合、ソースはシンボリックリンクが指し示すべきものを表す単なる文字列であることにも注意してください。通常、それが有用なものを指していることを検証するためのチェックは行われません。

$ ln -s "hello world" README.txt
$ ls -l
total 0
lrwxr-xr-x  1 kk  wheel  11 Sep 15 11:39 README.txt -> hello world
10
Kusalananda

これが誰かを助ける場合:私はそれを "ln whatwhere"と考えることに慣れており、最初の引数( "what")が既存のファイル、2番目(「場所」)は、それを配置する場所(リンク)です。他のほとんどの回答での推論とは対照的に、これは、記憶を助けるためにコマンドを入力しているときに、心の中で自分に暗示できる簡潔なフレーズにすぎません。これはおそらく誰にとっても有用ではないでしょうが、私はそれが一部の人々に役立つと思います。

他の標準的なファイル操作コマンドが同じ規則を使用するのに役立ちますので、cpmvについても同じことができます。

7
David Z

私は最近、この特定のことを思い出すための素晴らしい方法を聞きました:

古いもの、新しいもの、

借りたもの、青いもの、

彼女の靴に6ペンス。

最初の節は、lnの引数が何であるかです。何か古いものの後に新しいディレクトリエントリの名前が続きます。

6
loa_in_
NAME    ln -- make a link
SYNOPSIS    ln name1[ name2 ]
DESCRIPTION ln creates a link to an existing file name1. 
            If name2 is given, the link has that name; 

1971年以降 nix First Edition Manuals

secondの単純な構文形式があります。


編集: TARGETの代わりにFILEまたはFILENAMEを使用します---コメントなどを参照してください。下部にある非常に長い追加も参照して、iceberg、ハードおよびソフトlnの先端だけでなく、.


したがって、GNU lnにはこれがあります:

ln [opt] FILENAME

In the 2nd form, create a link to FILENAME in the current directory.

リンク名は必要ありません。 ln -s /usr/lib/modulesの後、

modules -> /usr/lib/modules

fILENAMEと同じ名前( "target"または "source")で、どこにいても選択の余地はなく、混乱もありません。

ここで、より要求が厳しく、リンクをanother nameおよび/またはsomewhere elseで作成したい場合は、add名前またはパスとして。実際のターゲットが最初に来て、エクストラファンタジーの新しいリンク名が2番目に来ます。


または、「リンクのls -lでこの矢印の表記を知っています。リンクの方向を示す矢印がシェルにないので、向きを変える必要があります。」

一方向で作成するため、他の方向でも使用できます。

(質問の解答の終わり)


別のレベルでは、「リンク」という言葉自体が、深い隠された二重の意味を持っています。シンボリックリンクは後で登場したため、初期の段階ではリンクは単なるリンクでした。ソフトとハードはなく、-sオプションもありませんでした。そして今、私はソースとターゲットのシンボリズムを使用しています:

mv    A B   --- move the whole file to B (dir or new name)
cp    A B   --- copy whole file (mv and cp are "the same" here)    
ln    A B   --- copy whole file MINUS data blocks (=copy only inode and name), and increase "link count" for track keeping

この段階では、リンクはありますが、ハードとソフトはありません。また、(ハード)リンクには方向がないため、ls -lには矢印は表示されません。 UNIX進化のその段階での「リンク」は、ファイルシステムのファイル名「B」(ディレクトリエントリ「B」)が、ファイル名「A」が指しているのと同じiノードを指すことを意味しました。

ファイルAとBは、同じブロックを共有しているため、「リンク」されています。したがって、すべてのrmで、カーネルは次のことをチェックする必要があります。ディスク上のこのファイルのブロックを削除/解放しますか、それとも同じブロックにリンクされている別のファイルがあるのですか?そのために、リンクカウンターが使用されます。

/ tmp gromにある大きなファイルを削除したままにしておき、ln /tmp/bigfileを実行するとします。これで、作業ディレクトリに大きなビッグファイルができました。/tmpをクリーンアップして「元の」ファイルを削除した後、同じデータブロックを引き続き使用していきます。リンクが切れたり、ぶら下がったりすることはありません。通常のファイルがあります。すべてのdirエントリが行うように、ファイルを指さず、ファイルシステムのみをブロックします。/tmpの「クリーニング」は、今ほど効果的ではありません。空のように見えますが、パーティション上のブロックは解放されません。

ハードリンク自体はcpのようにスペース自体を消費しませんが、間接的にはコストがかかります。

上記のシーケンスにln -sを追加します。

ln -s A B   --- copy only the file's name to "B"   

ソフトリンクである「B」には、パス名を持つ文字列のみが含まれています。これは「ソフト」情報です。技術的には、「A」と「B」は無関係です。しかし、Bは新しい意味で「リンク」であり、保存されたパス名をショートカットから「A」に使用できます。 "Aへのリンク"(ピリオド)であり、-"ファイルAのiノードとリンク"ではない

どちらの種類のリンクも、人間だけでなくカーネル/ fsも混乱させる可能性があります。 1971年のマニュアルページのメモ:「バグ:リンクは2回バックアップされ、個別のiノードを持つ個別のファイルとして復元されます。」

ディレクトリへのハードリンク(まれ/許可されていない)は、簡単に詰まる可能性があります。

ディレクトリへのソフトリンク(非常に一般的)は永遠のループにつながる可能性があります-ユーティリティ/カーネルによって認識される必要があります。

bashの実際の例

通常のファイル「F」から始めます...

ln F Fhard

... FhardをFと同じサイズにしますが、両方ともls -l --colorの矢印なしで暗赤色で表示されます。 statが「Inode:xyz」に関連して「Links:2」を表示するため。 Fをハードリンクすると、F自体がハードリンクに変わります。どちらもファイルタイプは「通常のファイル」です。ただし、どちらにもリンク数が1を超えるiノードがあります。

   ln -s F Fsoft

...ファイルタイプが「シンボリックリンク」の小さな「非正規」ファイル「Fsoft」を作成します---空のディレクトリよりもさらに多くのスペースを節約します。 ls -lは、「F」について特別なことを何も示していません。 Fsoftの場合、文字列が「F」であるため、表示されるサイズは1バイトであり、Fsoft -> Fが名前として表示されます。ソフトリンクを認識するためにソフトリンクに色を付ける必要はありません。短い形式ls -Fでは、コイル状のチェーン@が追加されるため、Fsoft@

ls -lでは、次のようになります。

-rw-r--r-- 2 root root 6070340 Sep 16 16:28 F
-rw-r--r-- 2 root root 6070340 Sep 16 16:28 Fhard
lrwxrwxrwx 1 root root       1 Sep 16 16:31 Fsoft -> F

FhardにはFのサイズとタイプがあります。

Fsoftには、サイズとしてFの名前とFの名前の長さ、および異なるファイルタイプがあります。

短いls -sF

5932 F    5932 Fhard     0 Fsoft@

--block-size=1を追加しても、同じサイズにはなりません。 Fsoftのサイズは「1バイト、0ブロック」です。 FとFhardは並行して逸脱します。

6074368 F  6074368 Fhard    0 Fsoft@

Fsoftがぶら下がっているかどうかを確認するには、lsで色を使用できます。

Orphan 40;31;01 # symlink to nonexistent file, or non-stat'able file
3
user370539

リンクの名前はオプションであることに注意してください。指定しない場合は、リンクターゲットのベース名が使用されます。

ln -s /path/to/file1 file1

リンク名を完全に削除するのと同じです:

ln -s /path/to/file1

リンクターゲットが最後に言及された場合、これは意味がありません。

2
rexkogitans

ちょうどUnix-> AT&T->右側の宛先を考えてください:

mov %eax, %ebx  ;; AT&T style assembler syntax: %ebx register gets value of %ecx

mv foo bar    ;; foo renamed to bar

cp foo bar    ;; contents of foo go to bar

foo | bar     ;; data moves left to right in pipeline

ln abc def    ;; link to abc installed as def
1
Kaz

個人的に、私は記憶 Xを避けることを好みます。必要なときに、X-についてどこを見るかを知ることを支持します。私は「申し訳ありませんが安全です」という態度のファンでもあるので、特にrootとして、自分が書いていることを常に注意深くチェックしたいと思っています。

この場合、答えは文字通りマンページの最初の行にあります:

   ln [OPTION]... [-T] TARGET LINK_NAME
   (...)
   In the 1st form, create a link to TARGET with the name LINK_NAME.

マンページを掘り下げる必要があるなら、私はそれを提案しなかったでしょうが、それは最初に正しいので、私見man lnを入力して終了するのにかかる3秒の価値があります。

0
dr_