回答:
これを試して、
cd /source/dir/path
find . -type d -exec mkdir -p -- /destination/directory/{} \;
. -type d
現在のパスのディレクトリを再帰的に一覧表示します。mkdir -p -- /destination/directory/{}
宛先にディレクトリを作成します。 これは、引数の単語の途中でのfind
展開をサポートする{}
に依存しています。
/source/dir/path
場合、シェルfind
がの展開で呼び出そうとすると、「引数リストが長すぎます」エラーで失敗する可能性があり*
ます。そのまま使用した方.
がよいでしょう。また、ほとんどのfind
実装では{}
、別の文字列と連結した場合でも使用できますが、これは普遍的なものではありません。
.
代わりに使用できます*
。(パフォーマンスとセキュリティのためにxargを使用する場合、おそらくパスの連結に外部スクリプトが必要になります)
使用rsync
:
rsync -a --include='*/' --exclude='*' /some/path/dir/ dir
これにより、ファイルをコピーせずに、現在のディレクトリののディレクトリ構造が再作成/some/path/dir
さdir
れます。
包含パターンにより、ソースパスで検出されたディレクトリはターゲットで作成されますが、それ以外のものは除外されます。-a
(--archive
)を使用することの副作用として、ターゲットのすべてのサブディレクトリでソースと同じタイムスタンプが取得されます。これは、リモートディレクトリからローカルディレクトリ構造を作成する場合にも機能します(逆も同様です)。
rsync
です!
を使用find
して、ソース構造を走査し、mkdir
出会う各ディレクトリを呼び出すことができます。
この例では、を使用してfind
、ディレクトリ構造をからfoo
にコピーします/tmp/another/
( cd foo && find -type d -exec sh -c 'for d do mkdir -p "/tmp/another/$d"; done' sh {} + )
exec
ループは、ディレクトリのセットの下に蓄積foo
その後に渡され、mkdir
。find
理解しているバージョンがない場合は、効率を犠牲にして+
使用できます\;
。代入mkdir
してecho mkdir
、実際にそれをやってなくてどうなるか見て。
... -exec sh -c 'for dirpath do mkdir -p "/some/path/$dirpath"; done' sh {} +
find: In ‘-exec ... {} +’ the ‘{}’ must appear by itself, but you specified ‘/tmp/another/{}’
(-exec ... \;
ただし、では動作します)
/path/to/{}
たと確信していますが、それが機能するバージョンを見つけることができなくなったので、ソリューションを調整しました。ありがとう
bashシェルでは、次のglobstar
オプションを使用して、すべてのディレクトリの展開を要求できます。
shopt -s globstar
そして、ループでディレクトリをコピーします:
for dir in **/
do
mkdir -p /path/to/dest/"$dir"
done
...または、1回の呼び出しですべてが収まると考えた場合mkdir
:
set -- **/
mkdir -- "${@/#//path/to/dest/}"
それは、「$@
配列のすべての要素を取り、それらのそれぞれの先頭をで置き換えるbash配列構文です/path/to/dest/
。
ls
ブレース展開リストとして直接出力する方法を知りません。**/
展開の出力をブレース展開にマッサージしようとした場合は、次のことに注意する必要があります。
{
や${
シーケンスを私はそれをお勧めしません。
問題は/superuser/1389580/copy-directory-structure-only-at-year-endのクロスサイト複製です
この種のタスクは、の典型的な使用例ですmtree
。
$ mkdir new-tree
$ mtree -cp old-tree | mtree -tdUp new-tree
.: modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
./bar missing (created)
./bar/bar2 missing (created)
./bar/bar2/bar3 missing (created)
./bar/bar2/bar3/bar4 missing (created)
./foo missing (created)
./foo/foo2 missing (created)
./foo/foo2/foo3 missing (created)
上記は、の下new-tree
に存在していたすべてのディレクトリを作成しますold-tree
。 mtree
ただし、新しく作成されたディレクトリにタイムスタンプを設定しないため、結果のツリーは次のようになります。
$ find old-tree new-tree -ls
20147 1 drwx--x--- 4 jim jim 5 Sep 24 14:27 old-tree
20048 1 drwx--x--- 3 jim jim 4 Sep 24 14:27 old-tree/foo
20363 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/foo/file
20073 1 drwx--x--- 3 jim jim 4 Sep 24 14:27 old-tree/foo/foo2
20074 1 drwx--x--- 2 jim jim 3 Sep 24 14:27 old-tree/foo/foo2/foo3
20365 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/foo/foo2/foo3/file
20364 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/foo/foo2/file
20051 1 drwx--x--- 3 jim jim 4 Sep 24 14:27 old-tree/bar
20077 1 drwx--x--- 3 jim jim 4 Sep 24 14:27 old-tree/bar/bar2
20368 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/bar/bar2/file
20078 1 drwx--x--- 3 jim jim 4 Sep 24 14:27 old-tree/bar/bar2/bar3
20369 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/bar/bar2/bar3/file
20079 1 drwx--x--- 2 jim jim 3 Sep 24 14:27 old-tree/bar/bar2/bar3/bar4
20370 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/bar/bar2/bar3/bar4/file
20366 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/bar/file
20362 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/file
134489 1 drwx--x--- 4 jim jim 4 Sep 24 16:34 new-tree
134490 1 drwx--x--- 3 jim jim 3 Sep 24 16:34 new-tree/bar
134491 1 drwx--x--- 3 jim jim 3 Sep 24 16:34 new-tree/bar/bar2
134492 1 drwx--x--- 3 jim jim 3 Sep 24 16:34 new-tree/bar/bar2/bar3
134493 1 drwx--x--- 2 jim jim 2 Sep 24 16:34 new-tree/bar/bar2/bar3/bar4
134494 1 drwx--x--- 3 jim jim 3 Sep 24 16:34 new-tree/foo
134495 1 drwx--x--- 3 jim jim 3 Sep 24 16:34 new-tree/foo/foo2
134496 1 drwx--x--- 2 jim jim 2 Sep 24 16:34 new-tree/foo/foo2/foo3
new-tree
タイムスタンプをのタイムスタンプと一致させたい場合はold-tree
、mtree
もう一度実行してください。ディレクトリは既に存在mtree
するため、ソースの仕様に一致するようにタイムスタンプを変更します。
$ mtree -cp old-tree | mtree -tdUp new-tree
.: modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
bar: modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
bar/bar2:
modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
bar/bar2/bar3:
modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
bar/bar2/bar3/bar4:
modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
foo: modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
foo/foo2:
modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
foo/foo2/foo3:
modification time (Tue Sep 24 14:27:07 2019, Tue Sep 24 16:34:57 2019, modified)
$ find old-tree new-tree -ls
20147 1 drwx--x--- 4 jim jim 5 Sep 24 14:27 old-tree
20048 1 drwx--x--- 3 jim jim 4 Sep 24 14:27 old-tree/foo
20363 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/foo/file
20073 1 drwx--x--- 3 jim jim 4 Sep 24 14:27 old-tree/foo/foo2
20074 1 drwx--x--- 2 jim jim 3 Sep 24 14:27 old-tree/foo/foo2/foo3
20365 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/foo/foo2/foo3/file
20364 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/foo/foo2/file
20051 1 drwx--x--- 3 jim jim 4 Sep 24 14:27 old-tree/bar
20077 1 drwx--x--- 3 jim jim 4 Sep 24 14:27 old-tree/bar/bar2
20368 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/bar/bar2/file
20078 1 drwx--x--- 3 jim jim 4 Sep 24 14:27 old-tree/bar/bar2/bar3
20369 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/bar/bar2/bar3/file
20079 1 drwx--x--- 2 jim jim 3 Sep 24 14:27 old-tree/bar/bar2/bar3/bar4
20370 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/bar/bar2/bar3/bar4/file
20366 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/bar/file
20362 1 -rw------- 1 jim jim 0 Sep 24 14:27 old-tree/file
134489 1 drwx--x--- 4 jim jim 4 Sep 24 14:27 new-tree
134490 1 drwx--x--- 3 jim jim 3 Sep 24 14:27 new-tree/bar
134491 1 drwx--x--- 3 jim jim 3 Sep 24 14:27 new-tree/bar/bar2
134492 1 drwx--x--- 3 jim jim 3 Sep 24 14:27 new-tree/bar/bar2/bar3
134493 1 drwx--x--- 2 jim jim 2 Sep 24 14:27 new-tree/bar/bar2/bar3/bar4
134494 1 drwx--x--- 3 jim jim 3 Sep 24 14:27 new-tree/foo
134495 1 drwx--x--- 3 jim jim 3 Sep 24 14:27 new-tree/foo/foo2
134496 1 drwx--x--- 2 jim jim 2 Sep 24 14:27 new-tree/foo/foo2/foo3
find
の補間をサポートしているわけではないことに注意してください{}
。