別のフォルダーに同じサブフォルダーを作成する


8

私はディレクトリ持っているfooサブディレクトリとします。コンテンツをコピーせずに、同じサブディレクトリ名を別のディレクトリに作成したい。どうすればよいですか?

lsブレース展開リストとして出力を取得する方法はありますか?

回答:


11

これを試して、

cd /source/dir/path
find . -type d -exec mkdir -p -- /destination/directory/{} \;
  • . -type d 現在のパスのディレクトリを再帰的に一覧表示します。
  • mkdir -p -- /destination/directory/{} 宛先にディレクトリを作成します。

これは、引数の単語の途中でのfind展開をサポートする{}に依存しています。


6
トップレベルのファイルまたはフォルダ名がダッシュで始まる場合、これは壊れる可能性があります。また、ドットで始まるディレクトリも省略されます。最後に、のすべての実装が別の文字列へfindの補間をサポートしているわけではないことに注意してください{}
roaima

1
そして、それは非常にスケーラブルではありません-何百万ものディレクトリがある場合、それはかなりの時間がかかります。
Arkadiusz Drabczyk

6
に多くのものがある/source/dir/path場合、シェルfindがの展開で呼び出そうとすると、「引数リストが長すぎます」エラーで失敗する可能性があり*ます。そのまま使用した方.がよいでしょう。また、ほとんどのfind実装では{}、別の文字列と連結した場合でも使用できますが、これは普遍的なものではありません。
クサラナンダ

1
この場合の.代わりに使用できます*。(パフォーマンスとセキュリティのためにxargを使用する場合、おそらくパスの連結に外部スクリプトが必要になります)
eckes

24

使用rsync

rsync -a --include='*/' --exclude='*' /some/path/dir/ dir

これにより、ファイルをコピーせずに、現在のディレクトリののディレクトリ構造が再作成/some/path/dirdirれます。

包含パターンにより、ソースパスで検出されたディレクトリはターゲットで作成されますが、それ以外のものは除外されます。-a--archive)を使用することの副作用として、ターゲットのすべてのサブディレクトリでソースと同じタイムスタンプが取得されます。これは、リモートディレクトリからローカルディレクトリ構造を作成する場合にも機能します(逆も同様です)。


答えはほとんどいつもrsyncです!
アロニカル

8

を使用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その後に渡され、mkdirfind理解しているバージョンがない場合は、効率を犠牲にして+使用できます\;。代入mkdirしてecho mkdir、実際にそれをやってなくてどうなるか見て。


1
または明白なループで... -exec sh -c 'for dirpath do mkdir -p "/some/path/$dirpath"; done' sh {} +
Kusalananda

正確にGNU find(4.7.0-git)では、これは動作しないようですfind: In ‘-exec ... {} +’ the ‘{}’ must appear by itself, but you specified ‘/tmp/another/{}’-exec ... \;ただし、では動作します)
ilkkachu

クサラナンダ、上達してくれてありがとう、
ロアイマ

Ilkkachu私はテストし/path/to/{}たと確信していますが、それが機能するバージョンを見つけることができなくなったので、ソリューションを調整しました。ありがとう
roaima

3

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ブレース展開リストとして直接出力する方法を知りません。**/展開の出力をブレース展開にマッサージしようとした場合は、次のことに注意する必要があります。

  • 出力のコンマをエスケープします
  • 任意の脱出{${シーケンスを
  • 結果の文字列が使用可能なコマンドライン引数スペースを超えていないことを確認します

私はそれをお勧めしません。


2

問題は/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-treemtreeただし、新しく作成されたディレクトリにタイムスタンプを設定しないため、結果のツリーは次のようになります。

$ 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-treemtreeもう一度実行してください。ディレクトリは既に存在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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.