Оболонка намагається розширити глобальну картину, перш ніж вона передасть розширений результат cp(фактично передає результат, до sudoякого потім передає його незмінним cp). Оскільки оболонка (вона працює як ви, а не root) не в змозі пройти каталог, в cpкінцевому підсумку отримує нерозширений візерунок у своєму списку аргументів.
cpне виконує жодного глобального розширення. Він очікує список імен файлів. Рядок із візерунком у ньому не називає файл.
Мабуть, самий прямий спосіб виконання завдання - викликати свою команду в підрозділі. Котируйте команду або подвійними лапками ( "), або одинарними ( ').
sudo sh -c "cp /data/*20150522* /backup/"
sudo sh -c 'cp /data/*20150522* /backup/'
Це працює, тому що підрозділ розширює шаблон шаблону в командному рядку перед тим, як викликати команду. Оскільки під-оболонка працює як root під sudo, розширення успішно.
Використання подвійних лапок для цитування команди до підкошти дозволяє батьківській оболонці розширити змінні оболонки перед викликом sudoкоманди. Якщо ви хочете, щоб змінні були розширені за допомогою підколі, замість цього слід використовувати одинарні лапки. У цьому випадку вона рівнозначна, оскільки у вас немає змінних. Але, ви можете додати його, щоб побачити різницю в поведінці.
sudo sh -c "echo $USER; cp /data/*20150522* /backup/"
sudo sh -c 'echo $USER; cp /data/*20150522* /backup/'
Перша команда відображатиме ваше ім'я користувача, тоді як друга команда відображатиме ім'я користувача root.
rootгрупи, вона не має дозволу перераховувати каталог. Вам знадобиться, щоб принаймні751(drwxrwx--x) для некорінного користувача перелічував каталог.