以下があるとしましょう。
Folder A
C1
file a
A2
Folder B
C1
B2
file b
B3
私が望むのは、これら2つのフォルダをマージすることです。これにより、以下が提供されます。
Folder C
C1
A2
B2
B3
file a
とは書いていないので参考にしてくださいfile b
。スキーマをマージしたいです。各リポジトリには異なるファイルが含まれており、そのファイルをマージディレクトリに追加したくありません。その結果、十分ではmv Folder\ A/* Folder\ B
ありません。
これを行う方法はありますか?
答え1
find
まあ、あなたはexecを持つことができますmkdir
。
cd /A/
find -type d -exec mkdir -p /C/{} \;
またはあなたの例のように構造が平らな場合find
cd /A/
for dir in */
do
mkdir -p /C/"$dir"
done
どちらの場合も同じですcd /B/
。
答え2
同じディレクトリ構造を作成する場合は、既存のfind
ディレクトリツリーをトラバースし、mkdir
各サブディレクトリで正しいパラメータを使用して呼び出すことができます。mkdir -p
既存のディレクトリを自動的にスキップするために呼び出されます。
cd 'Folder A'
find . -type d -exec mkdir -p '/path/to/Folder C/{} '\;
cd 'Folder B'
find . -type d -exec mkdir -p '/path/to/Folder C/{} '\;
zsh では、 がFolder A
同じディレクトリのサブディレクトリであるFolder B
と仮定します。Folder C
mkdir -p Folder\ [AB]/**/*(/e\''REPLY=Folder\ C/${REPLY#*/}'\')
ファイル権限を使用してディレクトリ階層を再現するには、rsyncを呼び出して通常のファイルではなくディレクトリのみを含むフィルタを提供できます。/
ソースディレクトリの末尾に含めて、個別の作成/path/to/Folder C
操作なしでその内容をすぐ下にコピーするようにします/path/to/Folder C/path/to/Folder A
。
rsync -a --include='*/' --exclude='*' '/path/to/Folder A/' '/path/to/Folder B/' '/path/to/Folder C'
答え3
私はそうします:
$ (find "Folder A"/* -type d ; find "Folder B"/* -type d) | \
sed 's#[^/]\+/##' | xargs -I{} mkdir -p "Folder C"/{}
詳細
これにより、「Folder A」と「Folder B」の下に次のサブディレクトリのリストが作成されます。
Folder A/A2
Folder A/C1
Folder B/B2
Folder B/B3
Folder B/C1
このコマンドを介して出力をパイプすると、sed
「Folder..」ビットが削除されます。
sed 's#[^/]\+/##'
結果は次のとおりです。
A2
C1
B2
B3
C1
メモ:上記はsed
左から見て、最初のスラッシュまでスラッシュ以外のすべての項目を見つけ、その文字を元の文字に置き換えて本質的に削除します。
この時点では、この繰り返し操作を完了するmkdir
ために使用できるように、「フォルダC」ディレクトリにのみ必要です。xargs
xargs -I{} mkdir -p "Folder C"/{}
これは、asの各パラメータを{}
次のコマンドの対応するパラメータに置き換えることを意味します{}
。
はい
サンプル:
$ tree Folder\ {A,B,C}
Folder A
|-- A2
`-- C1
`-- filea
Folder B
|-- B2
| `-- fileb
|-- B3
`-- C1
Folder C
メモ:「フォルダC」が空の場合は起動します。
次に、次のコマンドを実行します。
$ (find "Folder A"/* -type d ; find "Folder B"/* -type d) | \
sed 's#[^/]\+/##' | xargs -I{} mkdir -p "Folder C"/{}
私たちには次のことがありました。
$ tree Folder\ C
Folder C
|-- A2
|-- B2
|-- B3
`-- C1