Оболочка пытается развернуть шаблон glob, прежде чем передать расширенный результат в cp
(фактически, он передает результат в sudo
который затем передает его без изменений в cp
). Поскольку оболочка (она работает как вы, а не root) не может пройти по каталогу, cp
итоге получает нерасширенный шаблон в своем списке аргументов.
cp
не выполняет никакого расширения glob. Ожидается список имен файлов. Строка с шаблоном в ней не называет файл.
Возможно, самый простой способ выполнить задачу - вызвать вашу команду в под-оболочке. Заключите команду в кавычки ("
) или одинарные кавычки ('
).
sudo sh -c "cp /data/*20150522* /backup/"
sudo sh -c 'cp /data/*20150522* /backup/'
Это работает, потому что вложенная оболочка раскрывает шаблон glob в командной строке перед вызовом команды. Поскольку под-оболочка запускается с правами суперпользователя под sudo
, расширение прошло успешно.
Использование двойных кавычек для цитирования команды в под-оболочке позволяет родительской оболочке раскрывать переменные оболочки перед вызовом команды sudo
. Если вы хотите, чтобы переменные раскрывались под-оболочкой, вместо них следует использовать одинарные кавычки. В этом случае это эквивалентно, так как у вас нет никаких переменных. Но вы можете добавить один, чтобы увидеть разницу в поведении.
sudo sh -c "echo $USER; cp /data/*20150522* /backup/"
sudo sh -c 'echo $USER; cp /data/*20150522* /backup/'
Первая команда отобразит ваше имя пользователя, а вторая команда отобразит имя пользователя root.