Копирование структуры папок (без файлов) из одного места в другое
Я хочу создать клон структуры нашего многотерабайтного файлового сервера. Я знаю, что cp -- parents может переместить файл, и это родительская структура, но есть ли способ скопировать структуру каталогов неповрежденной?
Я хочу скопировать в систему linux, и наш файловый сервер установлен там CIFS.
12 ответов:
вы могли бы сделать что-то вроде:
find . -type d >dirs.txtчтобы создать список каталогов, то
xargs mkdir -p <dirs.txtдля создания каталогов в месте назначения.
вот простое решение с помощью rsync:
rsync -av -f"+ */" -f"- *" "$source" "$target"
- одна строка
- нет проблем с пробелами
- сохранить разрешения
Я не знаю, если вы ищете решение на Linux. Если да, то вы можете попробовать это:
$ mkdir destdir $ cd sourcedir $ find . -type d | cpio -pdvm destdir
это копирование атрибутов каталогов и файлов, но не данных файлов:
cp -R --attributes-only SOURCE DESTзатем вы можете удалить атрибуты файлов, если они вас не интересуют:
find DEST -type f -exec rm {} \;
это работает:
find ./<SOURCE_DIR>/ -type d | sed 's/\.\/<SOURCE_DIR>//g' | xargs -I {} mkdir -p <DEST_DIR>"/{}"просто замените SOURCE_DIR и DEST_DIR.
следующее решение хорошо работало для меня в различных средах:
sourceDir="some/directory" targetDir="any/other/directory" find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p
заменить
target_dirиsource_dirс соответствующими значениями:cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"протестировано на OSX + Ubuntu.
Это решает даже проблему с пробелами:
в оригинале / источнике реж.:
find . -type d -exec echo "'{}'" \; > dirs2.txtзатем воссоздать его во вновь созданном dir:
mkdir -p <../<SOURCEDIR>/dirs2.txt
Если вы можете получить доступ с компьютера Windows, вы можете использовать xcopy с /T и /E, чтобы скопировать только структуру папок (/E включает пустые папки)
[EDIT!]
этот использует rsync для воссоздания структуры каталогов, но без файлов. http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html
на самом деле может быть лучше :)
скрипт на питоне от Сергея Колодяжного опубликовано на скопировать только папки, а не файлы?:
#!/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))или из командной строки:
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_destinationFYI:
вот решение в php, что:
- копирует каталоги (не рекурсивно, только один уровень)
- сохраняет разрешения
- в отличие от решения rsync, быстро даже с каталогами, содержащими тысячи файлов, поскольку он даже не входит в папки
- не имеет проблем с пробелами
- должно быть легко читать и корректировать
создайте файл типа
syncDirs.phpС этим содержание:<?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()); }запустите его как пользователь, который имеет достаточно прав:
sudo php syncDirs.php /var/source /var/destination
Comments