Ответ 1
Вы можете сделать что-то вроде:
find . -type d >dirs.txt
чтобы создать список каталогов, затем
xargs mkdir -p <dirs.txt
для создания каталогов в пункте назначения.
Я хочу создать клон структуры нашего многотервального файлового сервера. Я знаю, что cp -parents могут перемещать файл и его родительскую структуру, но есть ли способ скопировать структуру каталогов без изменений?
Я хочу скопировать в систему Linux, и наш файловый сервер там установлен CIFS.
Вы можете сделать что-то вроде:
find . -type d >dirs.txt
чтобы создать список каталогов, затем
xargs mkdir -p <dirs.txt
для создания каталогов в пункте назначения.
cd /path/to/directories &&
find . -type d -exec mkdir -p -- /path/to/backup/{} \;
Вот простое решение с помощью 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.
Подставив target_dir
и source_dir
с соответствующими значениями:
cd target_dir && (cd source_dir; find . -type d ! -name .) | xargs -i mkdir -p "{}"
Протестировано на OSX + Ubuntu.
Следующее решение хорошо работало для меня в различных средах:
sourceDir="some/directory"
targetDir="any/other/directory"
find "$sourceDir" -type d | sed -e "s?$sourceDir?$targetDir?" | xargs mkdir -p
Это решает даже проблему с пробелами:
В исходном каталоге/источнике:
find . -type d -exec echo "'{}'" \; > dirs2.txt
затем заново создайте его во вновь создаваемом каталоге:
mkdir -p <../<SOURCEDIR>/dirs2.txt
Питон script от Сергея Колодяжного размещен на Скопировать только папки не файлы?:
#!/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_destination
FYI:
Вот решение в php, которое:
Создайте файл как 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
Другой подход заключается в использовании довольно удобного tree
и навигации по деревьям каталогов на основе его сильных опций. Есть варианты для каталога только, исключающих пустых каталогов, исключить имена с рисунком, включают в себя только имена с рисунком, и т.д. Проверьте man tree
Преимущество: вы можете редактировать или просматривать список, или если вы делаете много сценариев и часто создаете пакет пустых каталогов
Подход: создайте список каталогов, используя tree
, используйте этот список в качестве аргумента для ввода в mkdir
tree -dfi --noreport > some_dir_file.txt
-dfi
перечисляет только каталоги, печатает полный путь для каждого имени, заставляет дерево не печатать строки отступа,
--noreport
Позволяет печатать отчет о файле и каталоге в конце списка дерева, просто чтобы выходной файл не содержал пуха
Затем перейдите к месту назначения, где вы хотите пустые каталоги и выполните
xargs mkdir < some_dir_file.txt
Если вы можете получить доступ с компьютера Windows, вы можете использовать xcopy с /T и/E для копирования только структуры папок (/E включает в себя пустые папки)
[EDIT]
Этот использует rsync для воссоздания структуры каталогов, но без файлов. http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html
Возможно, будет лучше:)