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.
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.
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/{} \;
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
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
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 {} \;
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.
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
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.
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
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)
[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:)
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:
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
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