Назад | Перейти на главную страницу

Как позволить команде 'cp' не выдавать ошибку, если исходный файл не существует?

Я использую 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