Команда cp не работает с подстановочными знаками в Mac OS X

Вопрос или проблема

Я использую следующую команду на компьютере с 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*

Заключение

Пользуясь подстановочными знаками, важно учесть, что шелл обрабатывает их до передачи аргументов командам. Неверное применение кавычек может привести к ошибкам, как в вашем случае. Убедитесь, что вы точно понимаете, как работает обработка пространств и подстановочных символов. С удалением кавычек ваша команда должна заработать без проблем.

Если у вас возникнут дальнейшие вопросы или потребуется дополнительная помощь, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...