家系図ソフトウェアのサイクル


1594

私はいくつかの家系図ソフトウェア(C ++とQtで書かれた)の開発者です。私の顧客の1人がバグレポートを私にメールするまで問題はありませんでした。問題は、顧客には自分の娘を持つ2人の子供がいて、その結果、エラーのために彼が私のソフトウェアを使用できないことです。

これらのエラーは、処理されているファミリーグラフに関するさまざまなアサーションと不変条件の結果です(たとえば、サイクルを歩いた後、プログラムはXがYの父と祖父の両方になることはできないと述べています)。

すべてのデータアサーションを削除せずにこれらのエラーを解決するにはどうすればよいですか?



30
家系図をさかのぼって遡ると、この問題は予想以上に頻繁に発生します。ツリー表現を放棄することは苦痛かもしれませんが、最終的にはより正確になります。
Thomas

55
ありそうもないことに対してアサーションを追加するべきではありません。循環は、家系図グラフでは不可能である明らかなものです...いかなる方法でも、自分の祖先になることはできません。これらの他のアサーションは偽物であり、削除する必要があります。
pgod

44
これは、ペット飼育の世界ではまったくばかげた質問ではありません。娘から父親へ、母から息子へ、姉妹から兄弟へ、孫から祖父母へというのは標準的な技術であり、ペットブリーダーも家系図ソフトウェアが必要です。「純血種」私の¤%#&。
kaleissin

31
最初のいとことの結婚は、ビクトリア朝時代のイングランドでは、特に上流階級の間で非常に一般的でした(家族内でお金を保つための優れた方法でした)。たとえば、チャールズダーウィンは、彼のいとこのエマウェッジウッドと結婚しました。家系図ソフトウェアは、このような状況をサポートする必要があります。
rtperson

回答:


727

あなた(またはあなたの会社)は、家系図がどうあるべきかについて根本的な誤解をしているようです。

はっきりさせておきますが、私は(製品の1つとして)ポートフォリオに家系図を持っている会社でも働いており、同様の問題に取り組んでいます。

私たちの場合、そして私もあなたのケースを想定している問題は、家族がどうあるべきかについて非常に独断的であるGEDCOM形式に由来します。ただし、この形式には、家系図が実際にどのように見えるかについてのいくつかの深刻な誤解が含まれています。

GEDCOMには、同性間関係、近親相姦などの非互換性など、多くの問題があります。現実の世界では、これは想像以上に頻繁に発生します(特に1700〜1800に戻る場合)。

私たちは家系図を、現実の世界で何が起こるかをモデルにしています:イベント(たとえば、出産、結婚式、婚約、組合、死、養子縁組など)。論理的に不可能なものを除いて、これらに制限はありません(たとえば、自分の親になることはできません、関係には2人の個人が必要など)。

検証の欠如により、より「現実の世界」、よりシンプルでより柔軟なソリューションが実現します。

この特定のケースについては、アサーションが普遍的に保持されていないため、削除することをお勧めします。

問題が発生する(それが発生する)場合は、同じノードを必要な回数だけ描画し、そのうちの1つを選択するとすべてのコピーが点灯することで重複をほのめかすことをお勧めします。


32
これは正しいアプローチのように見え、より複雑な問題を検出するために拡張するのは簡単です。イベント間の「AがBの前に発生した」関係のセットを計算できます。たとえば、人が関わる他のイベントの前に生まれたこと。これは有向グラフです。次に、グラフにサイクルが含まれていないことを確認できます。StackOverflowでこの質問を参照してください。 これは、タイムトラベルが発明されるまでは問題ありません。
ポールハリソン

41
@ paul-harrisonそれだけの場合はそれだけです。古いレコード(新しいレコードでも)には、日付の不整合があります。出産前のバプテスマ、複数の出生記録など…なので、公式記録にはある程度、タイムトラベルがあります。この一貫性のないデータは許可されます。重複が発生した場合にアプリケーションが何を "the"の出生レコードと見なすかをユーザーが指定できるようにします。見つかった場合は、壊れたタイムラインを示します。
Bert Goethals、2011年

38
@ ben-voigt GEDCOMは末日聖徒イエス・キリスト教会によって作成されたフォーマットです。仕様書には、結婚(MARR)は男性と女性の間であると明記されています。同性結婚または近親相姦の場合は、ASSOタグを使用する必要があります(ASSOCIATES)。これは、友情や近所であることを示すためにも使用されます。同性結婚はこの仕様の中で二流の関係であることは明らかです。より中立的な仕様では、男性と女性の関係は要求されません。
Bert Goethals

1
@Bert Goethals:同性結婚をサポートしない特定のプログラム(PAF、レガシー)とGEDCOMを混同しています。GEDCOMは、「0 @ F1 @ FAM / 1 HUSB @ I1 @ / 1 HUSB @ I2 @」などの構成要素を排除しないため、ソフトウェアで選択した場合、同性結婚をサポートします。
Pierre

1
@Pierre確かにシステムをだますことができます。これは5.5.1ドキュメントから直接です:「MARR {MARRIAGE}:=夫婦として男女の家族単位を作成する法的、コモンロー、または慣習的なイベント。」(homepages.rootsweb.ancestry.com/~pmcbride/gedcom/55gcappa.htm)ご覧のとおり、ここには同性結婚はありません。
Bert Goethals 2014年

563

アサーションを緩和します。

ルールを変更することによってではなく、ほとんどの場合、顧客の99.9%がデータ入力の間違いを見つけるのに非常に役立ちます。

代わりに、「関係を追加できません」というエラーから「とにかく追加する」という警告に変更します。


143
非常にまれな状況、つまりユーザーが通常は誤って行う状況に遭遇した場合は、ユーザーに警告を表示することをお勧めします。それは良いフィードバックです。しかし、本当にそうしたい場合は、ユーザーに先に進んでもらいます。ですから、これはどのようにして根本的に理解できなくても、良い答えだと思います。
thomasrutter

15
いい答えです!この種のソフトウェアは「私は自分のおじいちゃん」(youtube.com/watch?v=eYlJH81dSiw)の状況をどのように処理するのでしょうか。
Zaur Nasibov

4
問題は実際にツリーを走査することから来ると思うので、これは実際には答えではありませんか?しかし、それは良い提案です。
bdwakefield

3
@bdwakefield:「すべてのデータアサーションを削除せずにこれらのエラーを解決するにはどうすればよいですか?」私はそれに答えたと思います。
Ben Voigt

2
@Benアサーションの目的によって異なります。無限ループや致命的なエラーの発生を防ぐことができる場合は、アサーションを削除することを効果的に提案しています。ユーザーが潜在的な間違いを警告するためにそこにいる場合、あなたの答えは良いものです。
rm999

224

ここに家系図の問題があります:それらは木ではありません。それらは有向非循環グラフまたはDAGです。人間の生殖の生物学の原理を正しく理解していれば、サイクルはありません。

私の知る限り、クリスチャンでさえ、いとこ同士の結婚(つまり子供)を受け入れます。これにより、家系図が家系DAGに変わります。

この話の教訓は、適切なデータ構造を選択することです。


7
それは、インビトロおよび有性生殖のためにそれを指し示す1つまたは2つの最大ノードを有するすべてのノードのさらなる制限を必要とするであろう。実生活により忠実であるようにするために、父親側での不確実な子孫に対して複数の破線を許可する場合があります(母親が誰であるかは常に明らかですが、父親が誰であるかを確認できるのはDNA検査だけであり、それは今日でもめったに行われません)。または両方の場合でも、採用が考慮されます。
manixrock

7
@manixrock-この質問はまれなケースに関するものなので、母親が誰であるかが常に明確であるとは限らないと主張したいと思います。養子縁組、放棄された赤ちゃん、代理母などはすべて問題を複雑にすることができます。
Peter Recore

9
それは必ずしも非周期的ではありませんね?男-結婚-祖母。
Ed Ropple、2011年

13
祖母と結婚する人は、自分を祖父にしてサイクルを追加することはありません。子供がいる場合は、循環しない通常のグラフエッジになります。
exDM69

11
実際には2つのADGです。血統グラフと法的関係グラフがあります。通常は同じですが、予想以上に異なる場合があります。
JSacksteder、2011年

115

小切手の根拠となる人物を一意に識別する価値があると思います。

これはトリッキーです。構造をツリーのままにしたいと仮定すると、これをお勧めします:

これを想定:A自分の娘と子供がいる。

AAととしてプログラムに自分自身を追加しBます。父親の役割を果たしたら、それを彼氏としましょう。

is_same_for_out()プログラムの出力生成部分に、データのプレゼンテーションでB内部的に行われるすべてのリンクが行われるべきであることを伝える関数を追加しAます。

これにより、ユーザーにとって余分な作業が発生しますが、ITの実装と保守は比較的簡単だと思います。

それから構築、あなたはコードパクに仕事ができるABの不整合を避けるために。

このソリューションは完全ではありませんが、最初のアプローチです。


9
おそらくそのような「プロキシ」ノードは確かに適切なソリューションです。しかし、私はそれらをユーザーの気分を害することなくユーザーインターフェイスにどのように置くことができるのか分かりません。私は、実在の人々(特にあなたの顧客)を扱うソフトウェアを書くのは容易ではないことを伝えます。
PartickHöse、

6
それは決して終わりません-Bの新しい息子は彼自身の叔父になります。プログラムの全額払い戻しを検討します。
Bo Persson、

3
@Will A:そして、彼は自分の母親でもあることに気づき、自分の若い自己をタイムエージェンシーに採用しますか?
Nullセット

2
1つのシステム内でのデータの複製(および同期)は悪い習慣です。これは、ソリューションが次善であり、再検討する必要があることを示しています。追加の(複製)ノードを作成する必要がある場合は、それをプロキシとして示し、データの読み取りと書き込みを元のノードに委任します。
Bert Goethals

84

あなたのソフトウェアにとって本当に価値があるものに焦点を当てるべきです。ライセンスの価格に見合った1人の消費者にとってそれを機能させるために費やされた時間はありますか?おそらくそうではない。

この顧客に謝罪し、彼の状況はソフトウェアの対象外であることを伝え、払い戻しを行うことをお勧めします。


3
とても本当です。しかし、他の人が提起した同様の問題を伴う他の潜在的な問題も比較検討してください。
ファルケン教授の契約が2011年

2
もちろん。理由は次のとおりです。それが重要でないアプリケーションでまれなエッジケースである場合、何かを修正したり実装したりする必要はありません。それがユーザーを本当に傷つけているなら、それに取り組むことには価値があります。
christopheml

10
たぶん誰もが自分の祖先のどこかに近親相姦のケースを持っています。したがって、家族の歴史を(あまりに)深く掘り下げると、その衝突にぶつかります。
datenwolf 2011

1
奇妙な状況(近親王族、Fritzlなど)の系図ツリーを作成することは、ソフトウェアの有効な使用法です。
Bulwersator 2013年

1
従兄弟が結婚できない家系図ソフトウェアは役に立たない。ほぼすべての家族が少なくとも1つのケースを持っています。そのため、元の例は効果を上げていると思います。
Fuzzy76 2015年

79

テストケースとしてAtreidesファミリ(現代のDuneまたは古代のOedipus Rex)をセットアップする必要があります。テストケースとしてサニタイズされたデータを使用しても、バグは見つかりません。


2
悲しいことに、あまりにも多くの人々が、システムを破壊するエッジケースの代わりに、まず「オーケー」なデータについて考えています。
sjas 2012

59

これが、「Go」などの言語にアサーションがない理由の1つです。これらは、おそらくあまり考えられなかったケースを処理するために使用されます。ありそうもないことではなく、不可能なことだけを主張するべきです。後者を実行すると、アサーションの評判が悪くなります。「」と入力するたびにassert(、10分間離れて実際に考えてください。

あなたの特に厄介なケースでは、そのような主張がまれではあるが可能性のある状況下では偽物であると考えられることも恐ろしいこともあります。したがって、「このソフトウェアは、あなたが提示したシナリオを処理するように設計されていません」と言うだけの場合は、アプリでそれを処理してください。

あなたの偉大な、偉大な、偉大な祖父があなたの父親であることが不可能であることを主張することは、行うのが理にかなっています。

あなたのソフトウェアをテストするために雇われたテスト会社で働いていたら、もちろんそのシナリオを提示したでしょう。どうして?すべての未成年者でありながらインテリジェントな「ユーザー」は、まったく同じことを行い、結果の「バグレポート」を楽しみます。


5
「アサーションをいつ使用するか」という引数に同意します。「一部の言語にはアサートがあり、Goにはない」とどのように関係しているかはわかりません。
phooji

2
@Red Hue-コンパイラは時々不可能を可能にします...可能。gccの一部のバージョンでは、abs()実装で-10 == 10と見なされます。
Tim Post

2
@Red Hue:アサーションの全体のポイントは、常に真(または偽)であるはずの条件を文書化してテストすることです。アプリを明示的に(微妙にではなく)破壊するため、不可能なケースが発生するような方法でユーザー(および他のユーザー)が「修正」するのを防ぐのに役立ちます。「不可能」なケースが表示される正当な理由がある場合は、主張しすぎています。
cHao

1
@cHao @Tim Post私は、アサーションが重要であることにほとんどの人が同意しているので、Goがアサーションを持たないことがなぜ良いのかを理解しようとしています。
Arlen

5
アサーション(またはアサーションのようなコード)があることは無関係です。Goのような言語のコードは、データの構造に関する仮定を行うことができます。アサーションでこれらの仮定を文書化して適用することはできません。結論:アプリケーションにバグがあります。
Tommy McGuire

41

このような台無しにされた状況についてコメントするのは嫌いですが、すべての不変条件を変更しないようにする最も簡単な方法は、近親相姦のお父さんへのプロキシとして機能する幻の頂点をグラフに作成することです。


37

だから、私は家系図ソフトウェアのいくつかの仕事をしました。あなたが解決しようとしている問題は、無限ループに入ることなくツリーを歩くことができる必要があるということです-つまり、ツリーは非循環的である必要があります。

ただし、人とその祖先の1つとの間のパスは1つだけであると主張しているようです。これはサイクルがないことを保証しますが、厳しすぎます。生物学的に言えば、子孫は有向非循環グラフ(DAG)です。あなたが持っているケースは確かに退化したケースですが、そのようなことは大きな木では常に起こります。

たとえば、世代nにある2 ^ nの祖先を見ると、重複がない場合は、1000人の生きている人々よりも多くの祖先が存在することになります。つまり、重複している必要があります。

ただし、無効なデータのみで無効なサイクルを取得する傾向もあります。ツリーをトラバースする場合は、サイクルを処理する必要があります。これは、個々のアルゴリズムごと、またはロード時に実行できます。ロード時にそれを行いました。

ツリー内の真のサイクルを見つけるには、いくつかの方法があります。間違った方法は、特定の個人のすべての祖先にマークを付けることです。トラバースするときに、次のステップに進む人がすでにマークされている場合は、リンクを切ります。これにより、潜在的に正確な関係が切断されます。それを行う正しい方法は、各個人から開始し、その祖先にその個人へのパスをマークすることです。新しいパスに現在のパスがサブパスとして含まれている場合、それはサイクルであり、分割する必要があります。パスをvector <bool>(MFMF、MFFFMFなど)として保存できるため、比較と保存が非常に高速になります。

2つのイテレータを送信し、サブセットテストと衝突するかどうかを確認するなど、サイクルを検出する方法は他にもいくつかありますが、結局ローカルストレージメソッドを使用しました。

また、リンクを実際に切断する必要はありません。通常のリンクから「弱い」リンクに変更するだけでよく、その後に一部のアルゴリズムが続きません。また、どのリンクを弱いものとしてマークするかを選択する際にも注意が必要です。場合によっては、生年月日の情報を見ることでサイクルをどこに壊すべきかを理解できますが、多くのデータが欠落しているために、何も理解できないことがよくあります。


それらの仮定に注意してください。男性と1人の女性の親1人が適応する時に与えられていない場合、または親として自分自身を考えるlesibans、近い将来、彼らも本当にすることができるかもしれこと、女の子の少なくとも生物学的に両親。さらに言えば、人間にドリーを適用すると、「人には2人の異なる親がいる」という仮定さえ外れます。
アグラジャグ

1
@Agrajag、そうだ。だから、私は「生物学的に話す」ことを周期検出に指定した。生物学的にさえ、代理母や人工授精など、多くの問題が考えられます。養子縁組や親を定義するためのその他の非生物学的方法も許可する場合、ツリーに有効な真の循環がある可能性があります。たとえば、誰かが祖父母を養子縁組して養子縁組できなくなった場合などです。 。人々の家庭生活についての仮定は常に複雑です。ソフトウェアを書くときしかし、あなたはいくつかの仮定をする必要があり...
tfinniga

36

ばかげた質問に対するもう一つのまじめな深刻な答え:

本当の答えは、適切なデータ構造を使用することです。人間の系図は、サイクルのない純粋なツリーを使用して完全に表現することはできません。ある種のグラフを使用する必要があります。また、これ以上先に進む前に人類学者に相談してください。「西部家父長制一夫多妻結婚」の最も単純なケースであっても、同様のエラーが系図をモデル化しようとする場合がたくさんあるためです。

ここで説明したようにローカルでのタブー関係を無視したい場合でも、家系図に循環を導入するための完全に合法で完全に予期しない方法がたくさんあります。

例:http : //en.wikipedia.org/wiki/Cousin_marriage

基本的に、いとこの結婚は一般的で期待されているだけでなく、それが人間が何千もの小さな家族グループから世界中の60億人の人口に移った理由です。他の方法では機能しません。

系図、家族、系統に関しては、普遍的なものはほとんどありません。叔母が誰であるか、誰が結婚できるか、または継承の目的で子供が正当化されるかを示唆する規範についてのほとんどすべての厳密な仮定は、世界または歴史のどこかの例外によって混乱する可能性があります。


9
あなたのコメントは私に一夫多妻制を思い起こさせました。有性生殖のみをモデル化する系図ソフトウェアは、精子と卵に付けられた名前を必要とする場合がありますが、家族構成のより広い定義では必要ありません。
Steve Kalemkiewicz

系図ソフトウェアでは、モデルに複数の配偶者を許可することがよくあります。ビューでのモデルの表示方法は、提供されている「モード」によって、1つのプログラム内でも大きく異なります。
トッドホプキンソン2012年

20

潜在的な法的影響はさておき、家系図の「ノード」は、ノードが唯一無二の人物であると想定するのではなく、先行者として扱う必要があるようです。

ツリーノードに後継者だけでなく人も含める-そして、異なる後継者を持つ同じ人を含む別のノードをツリーのさらに下に置くことができます。


13

いくつかの回答では、アサーション/インバリアントを保持する方法が示されていますが、これはアサーション/インバリアントの誤用のようです。アサーションは、真であるべきものが真であることを確認することであり、不変条件は、変更してはならないものが変わらないことを確認することです。

ここであなたが主張しているのは、近親相姦関係は存在しないということです。明らかにそれら存在するので、あなたの主張は無効です。このアサーションは回避できますが、実際のバグはアサーション自体にあります。アサーションを削除する必要があります。



5

系図データは循環的であり、非循環グラフに適合しないため、循環に対するアサーションがある場合はそれらを削除する必要があります。

カスタムビューを作成せずにビューでこれを処理する方法は、循環親を「ゴースト」親として扱うことです。つまり、ある人物が同じ人物の父と祖父の両方である場合、祖父ノードは通常表示されますが、父ノードは(「祖父を見る」のような単純なラベルを持つ「ゴースト」ノードとしてレンダリングされます。 )と祖父を指します。

計算を行うには、循環がある場合にノードが2回以上アクセスされないように、循環グラフを処理するようにロジックを改善する必要があります。


4

最も重要なことはavoid creating a problemなので、直接的な関係使用する必要があると思います、循環を回避するためにを。

@markmywordsが言ったように、#include "fritzl.h"。

最後に私は言わなければなりませんrecheck your data structure。たぶん、何かがうまくいかないかもしれません(双方向リンクリストで問題が解決するかもしれません)。


4

アサーションは現実を乗り越えられない

通常、アサーションは実際のデータとの接触を生き延びません。これは、ソフトウェアエンジニアリングプロセスの一部であり、どのデータを処理するか、どのデータを範囲外にするかを決定します。

循環族グラフ

家族の「木」(実際、それはサイクルを含む完全なグラフです)に関して、素晴らしい逸話があります:

私は成長した娘がいる未亡人と結婚しました。よく訪ねてきた父は、継娘に恋をして結婚しました。その結果、父は息子になり、娘は母になりました。しばらくして、私は妻に私の父の兄弟である息子と私の叔父を与えました。父の妻(私の娘であり母でもあります)には息子がいます。その結果、兄弟と孫が同じ人になりました。私の妻は今や私の祖母です。なぜなら彼女は私の母の母親だからです。だから私は妻の夫であり、同時に妻の継孫でもある。つまり、私は自分のおじいちゃんです。

サロゲートまたは「あいまいな父権」を考慮に入れると、事態はさらに奇妙になります。

それに対処する方法

範囲外としてサイクルを定義する

ソフトウェアがそのようなまれなケースを処理しないように決定することができます。このような場合、ユーザーは別の製品を使用する必要があります。これにより、より多くのアサーションとより単純なデータモデルを維持できるため、より一般的なケースへの対応がより堅牢になります。

この場合、必要なときにユーザーが別の製品に簡単に移行できるように、ソフトウェアに適切なインポートおよびエクスポート機能を追加します。

手動の関係を許可する

ユーザーが手動の関係を追加できるようにすることができます。これらの関係は「一流の市民」ではありません。つまり、ソフトウェアはそれらをそのまま受け取り、チェックせず、メインデータモデルで処理しません。

その後、ユーザーはまれなケースを手動で処理できます。データモデルは非常に単純なままであり、アサーションは存続します。

手動の関係には注意してください。それらを完全に構成可能にして、完全に構成可能なデータモデルを作成するという誘惑があります。これは機能しません。ソフトウェアが拡張されず、奇妙なバグが発生し、最終的にユーザーインターフェイスが使用できなくなります。このアンチパターンは「ソフトコーディング」と呼ばれ、「The Daily WTF」にはその例がたくさんあります。

データモデルをより柔軟にし、アサーションをスキップし、不変条件をテストする

最後の手段は、データモデルをより柔軟にすることです。ほとんどすべてのアサーションをスキップし、完全なグラフに基づいてデータモデルを作成する必要があります。上記の例が示すように、自分の祖父になることは簡単にできるので、サイクルを持つことさえできます。

この場合、ソフトウェアを広範囲にテストする必要があります。ほぼすべてのアサーションをスキップする必要があったため、追加のバグが発生する可能性が高くなります。

テストデータジェネレーターを使用して、異常なテストケースをチェックします。HaskellErlang、またはC用のクイックチェックライブラリがあります。Java / ScalaにはScalaCheckNyayaがあります。テストのアイデアの1つは、ランダムな母集団をシミュレートし、ランダムに交配させ、次にソフトウェアで最初にインポートしてから結果をエクスポートすることです。予想は、出力のすべての接続が入力にもあり、その逆も同様です。

プロパティが同じままであるケースは、不変と呼ばれます。この場合、不変量は、シミュレートされた母集団内の個人間の「ロマンチックな関係」のセットです。できるだけ多くの不変量を見つけて、ランダムに生成されたデータでそれらをテストしてください。不変条件は機能することができます、例えば:

  • 「ロマンチックな関係」を追加しても、叔父は叔父のままです。
  • すべての子供には親がいます
  • 2世代の母集団には少なくとも1人の祖父母がいる

または、技術的なこともあります。

  • ソフトウェアは、最大100億のメンバーのグラフでクラッシュしません(相互接続の数に関係なく)。
  • ソフトウェアはO(ノード数)とO(エッジ数^ 2)でスケーリングします
  • ソフトウェアは、最大100億のメンバーまでのすべてのファミリーグラフを保存および再ロードできます

シミュレートされたテストを実行すると、多くの奇妙なコーナーケースが見つかります。それらを修正するには、かなりの時間がかかります。また、多くの最適化が失われ、ソフトウェアの実行速度が大幅に低下します。それが価値があるかどうか、これがソフトウェアの範囲内にあるかどうかを判断する必要があります。


3

すべてのアサーションを削除するのではなく、自分の親である人や他の不可能な状況などをチェックして、エラーを表示する必要があります。可能性が低い場合は警告を発行して、ユーザーが一般的な入力エラーを検出できるようにするかもしれませんが、すべてが正しい場合は機能します。

私は各人の永続的な整数を持つベクトルにデータを格納し、親と子をpersonオブジェクトに格納します。この場合、intはベクトルのインデックスです。これは世代間を移動するのにかなり高速です(ただし、名前検索などの場合は低速です)。オブジェクトは、作成されたときの順序になります。


-3

父親を複製します(またはsymlink / referenceを使用します)。

たとえば、階層型データベースを使用している場合:

$ #each person node has two nodes representing its parents.
$ mkdir Family
$ mkdir Family/Son
$ mkdir Family/Son/Daughter
$ mkdir Family/Son/Father
$ mkdir Family/Son/Daughter/Father
$ ln -s Family/Son/Daughter/Father Family/Son/Father
$ mkdir Family/Son/Daughter/Wife
$ tree Family
Family
└── Son
    ├── Daughter
       ├── Father
       └── Wife
    └── Father -> Family/Son/Daughter/Father

4 directories, 1 file

3
ln -sコマンドは、そのように動作しません。リンクの解決は、コマンドを発行した場所からではなく、リンクが存在する場所の下からFamily/Son/Father検索します。Family/Son/Daughter/FatherFamily/Son.ln -s
musiphil 2012年

48
複製は
ジュネーブの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.