Среди множества вопросов cp я не нашел ничего об этой разнице в поведении (проверено на Ubuntu 18.04). Извините за потерянный пост, но настройка немного сложна.
Случай 1: Это ожидаемое поведение
Учитывая следующую папку
source
file1.cpp
file2.cpp
после запуска этого скрипта
#!/bin/bash
cp -r source/ target/
Я получаю этот результат
source # same as above, plus a copy in "target"
file1.cpp
file2.cpp
target
file1.cpp
file2.cpp
Случай 2: Используя тот же скрипт, исходная папка существует и пуста в целевой папке
Здесь есть одна дополнительная пустая папка source
file1. cpp file2. cpp target source
и запустите тот же сценарий
#!/bin/bash
cp -r source/ target/
, что дает другой, нежелательный результат
source # same as above, plus a copy in "target"
file1.cpp
file2.cpp
target
source
file1.cpp
file2.cpp
Нормальное решение для Case1 и Case2
cp -r source/ target/ # works only for Case 1
cp -r source/* target/ # works only for Case 2
В неправильном случае вызывают ошибку, другие дают неправильный результат, что может сбивать с толку. Это означает, что для каждого действия копирования я должен проверять, существует ли целевая папка, и использовать другую команду. Это очень громоздко, но я не знаю более простого решения.
Неразрешенная ситуация для Case2
Однако у меня есть проблема: когда я использую переменные для источника и цели, мой скрипт выглядит так
#!/bin/bash
SOURCE="source"
TARGET="target"
if [ -d "$TARGET" ]; then
cp -r $SOURCE $TARGET
else
cp -r $SOURCE/* $TARGET # note "$SOURCE/*" would fail.
fi
, и у меня есть путь $ SOURCE с пробелами.
SOURCE = "исходный код"
Поскольку я не могу использовать кавычки для исходной переменной, это вызывает две ошибки «каталог не найден».
Как я могу решить эту проблему для Case2?
EDIT
Чтобы прояснить проблему немного подробнее. Это
SOURCE="source"
cp -r "$SOURCE/*" $TARGET
завершается с ошибкой «не удается статистический источник / : нет такого файла или каталога». Я думаю, это означает, что bash не может заменить / списком файлов, и cp получает его как литерал файла. Очевидно, что файла или папки с именем «источник / *» не существует. Но, может быть, я думаю слишком просто, и то, что делает bash, отличается.