Я надеялся, что:
cp -R src/prog.js images/icon.jpg /tmp/package
даст симметричную структуру в целевом каталоге:
/tmp
|
+-- package
|
+-- src
| |
| +-- prog.js
|
+-- images
|
+-- icon.jpg
но вместо этого оба файла копируются в / tmp / package. Плоская копия. (Это на OSX).
Есть ли простая функция bash, которую я могу использовать для копирования всех файлов, включая файлы, указанные с помощью подстановочного знака (например, src / *. Js), в их законное место в целевом каталоге. Немного похоже на «запускать для каждого файла mkdir -p $(dirname "$file"); cp "$file" $(dirname "$file")
», но, возможно, одна команда.
Это соответствующая тема, которая предполагает, что это невозможно. Однако решение автора не так полезно для меня, потому что я хотел бы просто предоставить список файлов, подстановочных знаков или нет, и скопировать их все в целевой каталог. IIRC MS-DOS xcopy делает это, но, похоже, нет эквивалента для cp.
cp --parents
недопустимая опция в OSX (BSD cp), ноgcp
(GNU cp) работает нормально. Если его еще нет в вашей системе, используйтеbrew install coreutils
. У U будет много утилит с префиксом g.cp -R --parents
иrsync -rR
копирует файлы и каталоги относительно.В одну сторону:
источник
-C
опцию, чтобы выполнить chdir за вас -tar cf - _files_ | tar -C /dest xf -
или что-то в этом роде.В качестве альтернативы, если вы придерживаетесь старой школы, используйте cpio:
Очевидно, что вы можете фильтровать список файлов по своему усмотрению.
Параметр «-p» предназначен для «сквозного» режима (в отличие от «-i» для ввода или «-о» для вывода). '-V' является подробным (перечислить файлы по мере их обработки). '-M' сохраняет время модификации. «-B» означает использование «больших блоков» (где большие блоки имеют размер 5120 байт вместо 512 байт); возможно, в наши дни это не действует.
источник
-print0
с комбинацией--null
опций, чтобы она не прерывалась специальными символами и такими:find . -print0 | cpio -pvdmB --null /target
cpio
этой задаче. Я согласен , что-print0
и-null
варианты должны быть использованы, в противном случае, в какой - то момент кто - то даст вам некоторые папки с «специальные символы» (пробелы, скорее всего) и что - то произойдет. Не то чтобы я говорю из личного опыта, но вы можете попытаться создать резервную копию кучи файлов, и в результате будет создана резервная копия только половины из них из-за пробелов в именах файлов. (Хорошо, я говорю из личного опыта.)cpio
случае, если имена файлов содержат символы новой строки, - тогда вы обычно получаете сообщение об ошибке о двух (или более) именах файлов, которые не были найдены для каждой новой строки в имени файла. (Иногда вы можете получить меньше сообщений, но это требует большой осторожности при построении тестового примера.) Когда я использовалcpio
,--null
выбора не было; Параметры с двойным тире не были частью обозначений опций SVR4, и концепция-print0
не присутствовалаfind
ни в одном из них. Но это было давно (например, середина 90-х. До того, как Linux стал доминировать).xargs
- он разделяется на пробелы - пробелы, табуляторы, переводы строк. OTOH, я не уверен, как и зачем вы это сделали. Вcpio
руководстве GNU по режиму вывода четко указано, что в каждой строке указано одно имя файла. Руководство пользователя SVR4 (напечатано в 1990 г.) более расплывчато:cpio -o
(режим копирования) считывает стандартный ввод для получения списка путевых имен и копирует эти файлы в стандартный вывод вместе с именем пути и информацией о состоянии. Следовательно, есть шанс, что он разбил имена на пробелы.Параметр -R rsync сделает то, что вы ожидаете. Это очень многофункциональный копировальный аппарат. Например:
Примеры результатов:
источник
rsync конечно же! учебник здесь. и тут
Или в унисон
источник
Пытаться...
так что за то, что вы делали изначально ...
или
источник
echo
ни$v
здесь. Также этот метод не сработает, если соответствующий каталог не существует в месте назначения.