ディレクトリ構造を維持しながら、複数のフォルダからシンボリックリンクを作成したいと思います。いくつかの答えを読んで、今私が考えることができる最善の答えは次のとおりです。
find /data/DIV5/SASC/e042_ctcl/input/*/Clean_data/*/*/*.fq.gz -type f -exec ln -sf \{\} . \;
これにより、同じディレクトリにすべてのシンボリックリンクが生成されます。しかし、私が望むのは、find
コマンドと同じディレクトリ構造を持ち、可能であれば入力と同じ構造を使用することです。たとえば、input/*/Clean_data/*/*/*.fq.gz
ファイルとディレクトリが一致する場合、シンボリックリンクはコマンドを使用して見つけた絶対リンクと同じ構造に従う必要がありますfind
。
どんな意見でも感謝します。
ベストアンサー1
見苦しくて脆弱ですが、作業を完了する必要があります。
find /data/DIV5/SASC/e042_ctcl/input/*/Clean_data/*/*/*.fq.gz -type f -print0 | \
xargs -0 -n 1 \
sh -c 'mkdir -p "$PWD/`dirname $0`"; ln -s "$0" "$PWD/`dirname $0`"'
からインスピレーションを受けるカオスの回答、私はこの代替案を思いついたが、それも不要なディレクトリの整理:
find /data/DIV5/SASC/e042_ctcl/input/*/Clean_data/*/*/*.fq.gz -type f \
-printf 'mkdir -p "${PWD}/%h"; ln -s "%p" \\\n\t"${PWD}/%h"\n' | \
sed 's#/data/DIV5/SASC/e042_ctcl##' | \
sh -
それは必要なものを生成します目次そしてなぜなら注文する:
mkdir -p "${PWD}//data/DIV5/SASC/e042_ctcl/input/x/Clean_data/0/a"; ln -s "/data/DIV5/SASC/e042_ctcl/input/x/Clean_data/0/a/foobar.fq.gz" \
"${PWD}//data/DIV5/SASC/e042_ctcl/input/x/Clean_data/0/a"
その後、不要なディレクトリを削除します。sed、次に続く。
mkdir -p "${PWD}//input/x/Clean_data/0/a"; ln -s "/data/DIV5/SASC/e042_ctcl/input/x/Clean_data/0/a/foobar.fq.gz" \
"${PWD}//input/x/Clean_data/0/a"
これなぜならコマンドは同じ行から始まります。目次ターゲットの切り捨て中にソースをそのまま残すには、次の行に進みます。同じ行に印刷するか、別の行に印刷するには、より洗練された作業が必要です。sedスクリプト。
説明は次のとおりです。文書~のため探す、パラメータ-printf
:
%p
ファイル名(絶対パス名ではなくfindで見つかったファイル名、つまり始点の1つの相対パス)。
%h
ファイル名の前のディレクトリ(最後の要素と前のスラッシュを除くすべての要素)ファイル名にスラッシュが含まれていない場合(たとえば、コマンドラインで名前が指定されていて現在の作業ディレクトリにあるため)、 "%h"は "。 」に拡張されます。これにより、 "%h/%f" が "/foo" に拡張されるのを防ぐことができます。