Вопрос или проблема
Я использую следующую команду на компьютере с Mac OS X:
cp "/Users/username/Desktop/silverlock-dev/silverlock/../3rdparty/botan-build-desktop/src/libBotan*" "/Users/username/Desktop/silverlock-dev/silverlock-build-desktop/silverlocklib/../bin"
Однако я получаю:
cp: /Users/username/Desktop/silverlock-dev/silverlock/../3rdparty/botan-build-desktop/src/libBotan*: Нет такого файла или каталога
В этом каталоге явно есть 4 файла с названием:
libBotan.1.0.0.dylib
libBotan.1.0.dylib (символическая ссылка на первый файл)
libBotan.1.dylib (символическая ссылка на первый файл)
libBotan.dylib (символическая ссылка на первый файл)
Если я указываю полное название файла в команде копирования, все работает нормально, но мне нужно использовать подстановочный знак в процессе сборки. Логика иReason подсказывает, что это должно работать без проблем. Возможно, я что-то упускаю?
Когда вы ставите * в кавычки, это ожидает увидеть буквальное имя файла, а не производить расширение для подстановочного знака. Просто уберите кавычки, и это сработает. Также посмотрите superuser.com, там задаются подобные вопросы.
Когда оболочка расширяет подстановочные знаки в вашей командной строке, она сначала разделяет по пробелам, затем расширяет подстановочные знаки. Расширенные имена файлов (которые могут содержать пробелы) передаются как полноценные аргументы команде (cp
).
Обратите внимание, что команда (cp
в данном случае) никогда не видит кавычек, которые вы используете в командной строке оболочки, и не разделяет свои собственные аргументы по пробелам. Она получает список нековерцированных строк, каждая из которых может содержать пробелы.
Встретил аналогичную проблему и запутался – казалось, что это связано с использованием подстановочных знаков против использования кавычек, но есть способ использовать и то, и другое.
Но есть способ использовать и то, и другое, переместив подстановочный знак вне кавычек.
# cp: cannot stat '*wrapper*': Нет такого файла или каталога
cp "*wrapper*" /l/test/
# Скопирует все файлы без проблем.
cp *wrapper* /l/test/
# cp: cannot stat 'spaced name/*wrapper*': Нет такого файла или каталога
cp "spaced name/*wrapper*" /l/test/
# Снова работает нормально.
cp "spaced name"/*wrapper* /l/test/
PS Также смог воспроизвести это в Shell на Windows и на Ubuntu, так что это не проблема Mac OS.
Ответ или решение
Команда cp
на Mac OS X с использованием подстановочных символов может вызвать путаницу, и ваше описание проблемы подтверждает это. Позвольте мне объяснить, почему ваша текущая команда не работает, и как правильно использовать подстановочные символы.
Проблема с подстановочными знаками
Ваша команда выглядит следующим образом:
cp "/Users/username/Desktop/silverlock-dev/silverlock/../3rdparty/botan-build-desktop/src/libBotan*" "/Users/username/Desktop/silverlock-dev/silverlock-build-desktop/silverlocklib/../bin"
Ошибка, которую вы получаете, говорит о том, что файл не найден:
cp: /Users/username/Desktop/silverlock-dev/silverlock/../3rdparty/botan-build-desktop/src/libBotan*: No such file or directory
Что происходит здесь?
Причина, по которой команда не срабатывает, заключается в том, что при использовании кавычек, символ *
воспринимается как обычный текст, а не подстановочный символ. Таким образом, команда cp
не может найти файл с именем libBotan*
, поскольку такого файла действительно не существует.
Правильный способ использования подстановочных знаков
Чтобы корректно использовать подстановочные знаки, вам необходимо убрать кавычки вокруг пути к файлу. Таким образом команда должна выглядеть так:
cp /Users/username/Desktop/silverlock-dev/silverlock/../3rdparty/botan-build-desktop/src/libBotan* /Users/username/Desktop/silverlock-dev/silverlock-build-desktop/silverlocklib/../bin
Дополнительные замечания
- Обработка пробелов: Если в пути к файлам или директориям есть пробелы, вы можете использовать кавычки для всего пути, но подстановочные знаки должны быть вне кавычек. Например:
cp "/путь/с/пробелами/"* "/другая/директория/"
- Проверка файлов: Перед выполнением команды можно использовать
ls
с подстановочным знаком для проверки того, какие файлы будут затронуты:ls /Users/username/Desktop/silverlock-dev/silverlock/../3rdparty/botan-build-desktop/src/libBotan*
Заключение
Пользуясь подстановочными знаками, важно учесть, что шелл обрабатывает их до передачи аргументов командам. Неверное применение кавычек может привести к ошибкам, как в вашем случае. Убедитесь, что вы точно понимаете, как работает обработка пространств и подстановочных символов. С удалением кавычек ваша команда должна заработать без проблем.
Если у вас возникнут дальнейшие вопросы или потребуется дополнительная помощь, не стесняйтесь задавать их.