相対ディレクトリツリーを維持しながら選択したファイルへのシンボリックリンクを作成するためにfind + xargsを使用する方法(gnu cp -sを使用)

相対ディレクトリツリーを維持しながら選択したファイルへのシンボリックリンクを作成するためにfind + xargsを使用する方法(gnu cp -sを使用)

ディレクトリ構造で選択したファイルを重複ディレクトリのシンボリックリンクにコピーしようとしています。

次のディレクトリ構造で:

../1/a/data1.txt
../1/a/file1.txt
../1/a/b/file2.txt

これを行う:

../2/a/file1.txt -> ../../1/a/file1.txt
../2/a/b/file2.txt -> ../../2/a/b/file1.txt

たとえば、ディレクトリツリーを保持し、さまざまなパターンに一致するファイルをスキップします。

GNU cpを使用してターゲットディレクトリ(../2/a)の相対パスを置き換えると、data1.txtをコピーすることを除いて、すべてが必要に応じて機能します。

gcp -rs $(cd ../..; pwd)/1/a/* $PWD/

しかし、特定のファイルを除外するためにfind + xargsでそれを使用すると、

find  -X -f $(cd ../..; pwd)/1/a \! -name '*data*' -type f | xargs -t -n1 -I % gcp -s -t $PWD/ %

わかりました:

../2/a/file1.txt -> ../1/a/file1.txt
../2/a/file2.txt -> ../1/a/b/file2.txt

たとえば、ディレクトリ構造はコピーされません。退屈な回避策を想像することができますが、xargsの構文で重要なものが欠けているようです。 (特定の日付以前とそれ以降のファイルは別々に処理されるため、検索を利用したいと思います。)

私のソリューションおおよそのサブシェルを呼び出し、パスを作成し、ディレクトリを作成し、リンクを作成します(例:ここではテストされていません)。

find $(cd ../..; pwd) -type f \! -name '*data*' -print0 | xargs -0 bash -c 
     'while [ -n "$1" ]; do
           TMP="${1%$(basename $1)}"; 
           mkdir -p "${TMP/1/2}";  
           gcp -s "$1" "${1/1/2}"; 
           shift;
      done;' "bash"

これはスクリプト内で呼び出されるため、コマンドの前に関連するパス名をエクスポートしました(ここで、「1」と「2」は実際には$ PATH1、$ PATH2です。この例では、$ 1のb / cは「1」です。は混乱しています。」)

答え1

-rパラメータなしでディレクトリを繰り返しコピーすると、cp中間ディレクトリは作成されません。 (単に追加することはうまく-rいきません。ソースがディレクトリでなければ効果はありません。)

-rGNUのオプションln(「相対リンクの作成」)を試して、例を使用できますmkdir -p {dirname}

# usage mklinks from to [opts/predicates for find ..]
mklinks(){
    from=$1; shift
    to=$1; shift
    find "$from" -type f "$@" -print0 | from=$from to=$to gxargs -0 sh -c '
        for a; do
            t="$to/${a#$from}"; b=${t##*/}
            mkdir -vp "${t%$b}" && gln -vrs "$a" "$t"
        done
    ' sh
}

mklinks ../../1/a . \! -name '*data*'

もちろん、Linuxを使用している場合はandgxargsに変更してくださいxargsglnln

関連情報