У меня есть каталог foo
с подкаталогами. Я хочу создать те же имена подкаталогов в другом каталоге, не копируя их содержимое. Как мне это сделать?
Есть ли способ получить ls
вывод в виде расширенного списка скобок?
Попробуй это,
cd /source/dir/path
find . -type d -exec mkdir -p -- /destination/directory/{} \;
. -type d
Список каталогов по текущему пути рекурсивно.mkdir -p -- /destination/directory/{}
создать каталог в месте назначения. Это полагается на то, find
что поддерживает расширение {}
в середине аргументного слова.
find
виду, что не каждая реализация поддерживает интерполяцию{}
в другую строку./source/dir/path
, то это , возможно , не с «списком аргументов слишком длинной» ошибка , когда оболочка пытается вызватьfind
с расширением*
. Лучше просто использовать.
там. Кроме того, большинствоfind
реализаций позволяет{}
использовать его даже при объединении с другой строкой, но это не универсально..
вместо*
в этом случае. (Использование xarg для производительности и безопасности, вероятно, потребует внешнего сценария для конкатенации путей)Использование
rsync
:Это воссоздает структуру каталогов,
/some/path/dir
какdir
в текущем каталоге, без копирования каких-либо файлов.Любой каталог, найденный в исходном пути, будет создан на цели из-за шаблона включения, но все остальное будет исключено. В качестве побочного эффекта использования
-a
(--archive
) вы получите те же временные метки во всех подкаталогах в цели, что и в источнике. Это также работает для создания локальных структур каталогов из удаленных каталогов (и наоборот).источник
rsync
!Вы можете использовать
find
для обхода структуры источника и вызоваmkdir
для каждого каталога, который встречается.В этом примере, используя
find
, будет копировать структуру каталогов отfoo
до/tmp/another/
exec
Цикл создает множество каталогов под нимfoo
, который затем передаетсяmkdir
. Если у вас нет версии,find
которая понимает,+
вы можете использовать\;
за счет эффективности. Подставимmkdir
с ,echo mkdir
чтобы увидеть , что произойдет , не на самом деле делать это.источник
... -exec sh -c 'for dirpath do mkdir -p "/some/path/$dirpath"; done' sh {} +
find: In ‘-exec ... {} +’ the ‘{}’ must appear by itself, but you specified ‘/tmp/another/{}’
(-exec ... \;
хотя и работает с )/path/to/{}
но я не могу найти ни одной версии, где она работает, поэтому я адаптировал решение. СпасибоС оболочкой bash вы можете запросить расширение каждого каталога с помощью
globstar
опции:а затем скопируйте каталоги с помощью цикла:
... или если бы вы думали, что они все подойдут в течение одного звонка
mkdir
:Это синтаксис массива bash, который гласит: «возьмите каждый элемент
$@
массива и замените начало каждого из них на/path/to/dest/
.Я не знаю,
ls
как напрямую получить вывод в виде списка расширений. Если вы попытаетесь втиснуть вывод**/
расширения в расширение фигурной скобки, вам нужно быть осторожным:{
или${
последовательностиЯ бы не рекомендовал это.
источник
Этот вопрос является дубликатом кросс-сайта /superuser/1389580/copy-directory-structure-only-at-year-end
Этот вид задачи является классическим вариантом использования для
mtree
:Вышеприведенное создает все каталоги, под
new-tree
которыми присутствовалиold-tree
.mtree
однако не устанавливает метки времени для вновь создаваемых каталогов, поэтому результирующее дерево выглядит так:Если вы предпочитаете, чтобы
new-tree
временные метки совпадали с указаннымиold-tree
, просто запуститеmtree
снова. Поскольку каталоги уже существуют,mtree
изменит временные метки в соответствии со спецификацией источника:источник