ワイルドカードを介したマルチシンボリックリンク: "ln -s ../*/*.txt TXT/"

ワイルドカードを介したマルチシンボリックリンク: "ln -s ../*/*.txt TXT/"

以下の例のように、ワイルドカードを使用して複数のシンボリックリンクを作成しようとしています。

$ ls -R
.:
TXT  a  b

./TXT:

./a:
a.txt

./b:
b.txt

a、b、TXTなど、さまざまなサブディレクトリを含む「親ディレクトリ」があります。 「a」と「b」には、さまざまなテキストファイル(上記の例ではa.txt、b.txt)があります。

「TXT」サブディレクトリの各「.txt」ファイルに対して「相対」シンボリックリンクを作成したいと思います。しかし:

  • 「検索」を使用しない
  • TXTディレクトリに「cd」がありません

つまり、次のコマンドが機能しない理由を知りたいのです。

ln -s ../*/*txt TXT/

以前の「cd TXT」を使用すると、次のように動作します。

cd TXT
ln -s ../*/*txt .

私はbashが「*」と「../」を拡張するので、問題が発生すると思います。 bash は「../*/*.txt」を拡張できません。なぜなら、そのファイルは実際には存在しないからです。したがって、 "ln"は必要なリンクを生成できません。 :現在の作業ディレクトリに基づいて「1レベル上」ディレクトリにtxtファイルへのリンクを作成します。 「..」で「cd」を選択し、このレベルのすべてのディレクトリを考慮して「.txt」ファイルを見つけます。

おそらく「ルール」は、シンボリックリンクTARGETが次のことを行う必要があるということです。

  • また、実際のファイルを指します(そうしないと、bashは「..」または「*」を正しい方法で拡張できません)。
  • リンクを含むディレクトリに相対的でなければなりません。

正確に何が問題であり、考えられる解決策が何であるかを確認して説明できますか?

PS。 「find」を使用すると、次のコマンドが機能しているようです。

find ./ -path ./TXT -prune -o -iname "*.txt" -type f -exec ln -s ."{}" -t TXT/ \;

この場合も、「存在しない」パスを使用する必要があります。

."{}"

ただし、-exec コマンドは "{}" (例: "./a/a.txt" および "./b/b.txt") のみを拡張するため、 "ln" はプレフィックスを追加して TXT 宛先ディレクトリに基づいて正しいルートポイントを構築できます。 「。」。

答え1

このコマンドを使用しています

ln -s ../*/*txt TXT/

abが含まれているディレクトリにある場合、シェルはまたはのエントリと一致するようにTXT拡張できません。これを使用する必要がありますが、内部のシンボリックリンクはあるレベルから外れ、相対パスに別のレベルが必要です。../*/*txtab*/*txtTXT../

最も簡単な解決策はこれですが、あなたは避けたいと言いました。cd

( cd TXT && ln -s ../*/*txt . )

別の回避策では、リンクを順番に変更する必要があります。

for f in */*txt
do
    ln -s ../"$f" TXT
done

ソースディレクトリがあり、a同じbレベルにあるため、両方TXTの提案のワイルドカードは3つのディレクトリと一致します。

関連情報