Рейтинг:0

Скопируйте все из папки в корневой каталог проекта

флаг in

У меня есть веб-проект со следующей структурой:

применение/
свалки/
нгинкс/
журналы/
.git/
докер-compose.yml
Докерфайл
README.md
.gitignore

По ряду причин хотелось бы распустить папку приложения и скопировать все файлы в корневую директорию. Я хотел бы сделать это, как обычно, через CLI. Однако на данный момент я никуда не двигаюсь.

Я пробовал следующее. Я в корне проекта.

cp -r приложение/ ./
// вывод cp: 'application/' и './application' - это один и тот же файл

cp -r приложение/*.* ./
// копируем только корневые файлы из приложения в корень проекта, а не папки.

Что как бы логично. Как мне сформулировать команду, чтобы она копировала файлы только в корень? Это, наверное, мелочь, но мне еще рано.

Maik Lowrey avatar
флаг in
@NateT Я бы удалил приложение, но я скопирую, прежде чем удалять все содержимое в корень. Да.
terdon avatar
флаг cn
Помните, что большинство файлов не имеют расширений в системах Linux, поэтому `*.*` почти никогда не будет тем, что вам нужно, поскольку оно будет соответствовать только файлам или каталогам, в имени которых есть `.`. Чтобы сопоставить все, вам просто нужно `*`.
Рейтинг:0
флаг in

Хорошо. Я понял. Это было действительно слишком рано ;-) Правильная команда была бы:

cp -приложение/. ./

И лучше использовать опцию -a вместо опции -r. Это улучшенный рекурсивный вариант и средства, которые сохраняют все атрибуты файла, а также сохраняют символические ссылки. Нашел это: Как я могу скопировать содержимое папки в другую папку в другом каталоге с помощью терминала?

. в конце исходного пути находится специальный синтаксис cp, который позволяет скопировать все файлы и папки, включая скрытые.

bac0n avatar
флаг cn
думаю, вы хотели сделать `cp -T app/ .` (вероятно, было бы разумно добавить `-i`)
Maik Lowrey avatar
флаг in
@ bac0n Спасибо за комментарий. Почему вы советуете добавить опцию `i`? а что значит -Т? я скопировал его, как в своем ответе, и он работал хорошо «до сих пор». стоит ли мне волноваться сейчас?
Maik Lowrey avatar
флаг in
@ bac0n я имею в виду интерактивный. да было бы хорошо. Благодарю. но я не нашел объяснения опции -T.
bac0n avatar
флаг cn
Цель не обязательно должна существовать перед копированием, это, вероятно, основное отличие, затем, если * источник * является файлом и нацелен на каталог, вы получаете сообщение об ошибке вместо того, чтобы файл копировался в каталог (должно быть cp -aT или -rT для рекурсивного).
Nate T avatar
флаг it
@Maik Это Bash, есть 10 разных способов сделать что угодно. Я как раз работал над сценарием. который использует как `cp -a`, так и перенаправление от find в пределах 10-15 строк друг от друга. Я бы порекомендовал изучить все версии и изучить особенности и предостережения каждой из них. Например, набор команд может быть абсолютно одинаковым с параметрами, но только одна из них считывается со стандартного ввода без параметров. Это может не иметь значения в 90% случаев, но в этот 10-й раз полезно знать разницу.Решил, что укажу на это, поскольку это то, к чему я изначально стремился, но я думаю, что раньше промахивался.
terdon avatar
флаг cn
Обратите внимание, что это также скопирует подкаталоги, а ваш вопрос касается только файлов. Не уверен, задумано это или нет.
Maik Lowrey avatar
флаг in
@terdon файлы и папки. я обновлю заголовок из моего вопроса.
Рейтинг:-1
флаг it

Вам просто нужен подстановочный знак в конце команды, например:

cp -r приложение/* ./
Maik Lowrey avatar
флаг in
Спасибо, что ответили. Но это не работает. `cp: отсутствует операнд файла назначения после 'sub/*'`
Maik Lowrey avatar
флаг in
Да, это тоже сработает. Но я использовал `cp -a app/. ./` раньше, и он отлично работает. Я был расстроен комментарием bac0n. Вы случайно не знаете, что означает опция `-T`?
Nate T avatar
флаг it
Рад, что ты понял. @MaikLowrey
Maik Lowrey avatar
флаг in
Спасибо за ваше время и усилия!
terdon avatar
флаг cn
@MaikLowrey в исходном ответе были кавычки вокруг `"application/*"`, из-за чего глобус (подстановочный знак) не расширялся. Я это исправил, но боюсь, что вторая команда совершенно неверна. Я _думаю_, что Нейт имел в виду что-то вроде `find ./application/ -type f -exec cp {} ./ +`.Вместо этого команда в этом ответе будет искать _directories_ в каталоге `/application/`, а затем добавит список имен каталогов в файл с именем `/`, который завершится ошибкой, поскольку `/` является каталогом.
Maik Lowrey avatar
флаг in
Спасибо @terdon! Ты прав. Я взял `cp -a app/. ./` Лучше всего использовать команду с параметром -i (спасибо bac0n), чтобы избежать перезаписи файлов с одинаковыми именами. В моем случае был перезаписан «только» .gitigniore. Команды с рекурсией следует использовать осторожно.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.