Я использую Mac OS X. Я пытаюсь скопировать некоторые файлы с помощью команды cp для такого сценария сборки.
cp ./src/*/*.h ./aaa
Но эта команда выдает ошибку, если в каталоге ./src нет файла .h. Как заставить команду не выдавать ошибку? (тихий сбой) Ошибка приводит к сбою результата сборки, но я просто хочу скопировать, когда есть только какой-то файл заголовка.
Если вы говорите о сообщении об ошибке, вы можете подавить его, отправив его в битовое ведро:
cp ./src/*/*.h ./aaa 2>/dev/null
Если вы хотите подавить код выхода и сообщение об ошибке:
cp ./src/*/*.h ./aaa 2>/dev/null || :
Вы ищете что-то вроде
if [ -e file ]
then cp file /somewhere
fi
(К сожалению, -f
вариант - не тот дроид, который вам нужен.)
Если вы хотите сопоставить глобус, это не сработает; использовать find
вместо этого, например:
find ./src -name \*.h -exec cp {} ./destination \;
Старый вопрос, но он может быть актуален для других.
Если вы этого не сделаете необходимость чтобы использовать cp, вы можете попробовать rsync.
Чтобы скопировать все файлы из источника в каталог назначения, запустите:
rsync -avzh --ignore-errors /path/to/source /path/to/destination
Rsync входит в состав большинства Unix-подобных систем, таких как Linux, Mac OS X или FreeBSD.
Установка результата в true гарантирует, что команда всегда будет успешной. Я пробовал это в Linux, но не в Mac OS:
cp ./src/*/*.h ./aaa | true
Вы можете принудительно установить правильный статус ошибки. С функцией:
$ cpalways () { cp $1 $2 2>/dev/null ; return 0 ; }
Учитывая следующее:
$ ls foo bar baz
ls: baz: No such file or directory
bar foo
Обычная копия вернет ошибку. Он вернет статус выхода 1.
$ cp baz bar ; echo $?
cp: baz: No such file or directory
1
Если мы воспользуемся функцией cpalways () выше, все ошибки будут скрыты:
$ cpalways baz bar ; echo $?
0
$ cpalways foo bar ; echo $?
0
$ cpalways baz bar ; echo $?
0