ディレクトリ構造で選択したファイルを重複ディレクトリのシンボリックリンクにコピーしようとしています。
次のディレクトリ構造で:
../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
いきません。ソースがディレクトリでなければ効果はありません。)
-r
GNUのオプション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
に変更してくださいxargs
。gln
ln