Kopiowanie struktury folderów (bez plików) z jednego miejsca do drugiego

Chcę stworzyć klon struktury naszego wieloterabajtowego serwera plików. Wiem ,że CP -- parents może przenieść plik i jego strukturę nadrzędną, ale czy jest jakiś sposób, aby skopiować strukturę katalogów nienaruszoną?

Chcę skopiować do systemu linux i nasz serwer plików jest CIFS zamontowany tam.

Author: r00fus, 2010-11-02

12 answers

Możesz zrobić coś takiego:

find . -type d >dirs.txt

Aby utworzyć listę katalogów, następnie

xargs mkdir -p <dirs.txt

Aby utworzyć katalogi na miejscu docelowym.

 124
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-01 23:37:12
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
 59
Author: amphetamachine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-01 23:39:26

Oto proste rozwiązanie przy użyciu rsync:

rsync -av -f"+ */" -f"- *" "$source" "$target"
  • Jedna linia
  • brak problemów ze spacjami
  • zachowaj uprawnienia

Znalazłem tam takie rozwiązanie

 14
Author: Gildas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-30 12:07:23

Nie wiem, czy szukasz rozwiązania na Linuksa. Jeśli tak, możesz spróbować tego:

$ mkdir destdir
$ cd sourcedir
$ find . -type d | cpio -pdvm destdir
 5
Author: zerodin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-23 16:04:33

To kopiuje katalogi i atrybuty plików, ale nie dane Plików:

cp -R --attributes-only SOURCE DEST

Wtedy możesz usunąć atrybuty plików, jeśli nie jesteś nimi zainteresowany:

find DEST -type f -exec rm {} \;
 4
Author: toliveira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-27 17:15:42

To działa:

find ./<SOURCE_DIR>/ -type d | sed 's/\.\/<SOURCE_DIR>//g' | xargs -I {} mkdir -p <DEST_DIR>"/{}"

Wystarczy zastąpić SOURCE_DIR i DEST_DIR.

 2
Author: mijhael3000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-04 08:47:21

Poniższe rozwiązanie działało dobrze dla mnie w różnych środowiskach:

sourceDir="some/directory"
targetDir="any/other/directory"

find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p
 1
Author: yaccob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-22 16:07:51

Zastąp target_dir i source_dir odpowiednimi wartościami:

cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"

Testowane na OSX + Ubuntu.

 1
Author: luissquall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-30 13:40:33

To rozwiązuje nawet problem z białymi spacjami:

W oryginalnym/źródłowym katalogu:

find . -type d -exec echo "'{}'" \; > dirs2.txt

Następnie odtworzyć go w nowo utworzonym katalogu:

mkdir -p <../<SOURCEDIR>/dirs2.txt
 1
Author: Thim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-18 13:32:37

Jeśli możesz uzyskać dostęp z komputera z systemem Windows, możesz użyć xcopy z /T i /E, aby skopiować tylko strukturę folderów (/E zawiera puste foldery)

Http://ss64.com/nt/xcopy.html

[EDIT!]

Ten używa rsync do odtworzenia struktury katalogów, ale bez plików. http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html

Faktycznie może być lepiej:)

 0
Author: dotalchemy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-01 23:39:26

Skrypt Pythona od Sergiy Kołodyazhnyy posted on Kopiuj tylko foldery a nie Pliki?:

#!/usr/bin/env python
import os,sys
dirs=[ r for r,s,f in os.walk(".") if r != "."]
for i in dirs:
    os.makedirs(os.path.join(sys.argv[1],i)) 

Lub z powłoki:

python -c 'import os,sys;dirs=[ r for r,s,f in os.walk(".") if r != "."];[os.makedirs(os.path.join(sys.argv[1],i)) for i in dirs]' ~/new_destination

FYI:

 0
Author: Franck Dernoncourt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-08 23:13:20

Oto rozwiązanie w php, które:

  • kopiuje katalogi (nie rekurencyjnie, tylko jeden poziom)
  • zachowuje uprawnienia
  • W przeciwieństwie do rozwiązania rsync, jest szybki nawet z katalogami zawierającymi tysiące plików, ponieważ nie wchodzi nawet do folderów
  • nie ma problemów ze spacjami
  • powinny być łatwe do odczytania i dostosowania

Utwórz plik podobny do syncDirs.php o tej treści:

<?php
foreach (new DirectoryIterator($argv[1]) as $f) {
    if($f->isDot() || !$f->isDir()) continue;
        mkdir($argv[2].'/'.$f->getFilename(), $f->getPerms());
        chown($argv[2].'/'.$f->getFilename(), $f->getOwner());
        chgrp($argv[2].'/'.$f->getFilename(), $f->getGroup());
}

Uruchom go jako użytkownik, który ma wystarczająco prawa:

sudo php syncDirs.php /var/source /var/destination

 0
Author: Christopher K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 18:02:22