소스 파일이 없을 때 'cp'명령으로 오류가 발생하지 않도록하는 방법은 무엇입니까?


59

Mac OS X를 사용하고 있습니다. 이와 같은 빌드 스크립트를 위해 cp 명령으로 일부 파일을 복사하려고합니다.

cp ./src/*/*.h ./aaa

그러나 ./src 디렉토리에 .h 파일이 없으면이 명령이 오류를 발생시킵니다. 명령이 오류를 발생시키지 않는 방법? (자동 실패) 오류로 인해 빌드 결과가 실패하지만 헤더 파일 만있을 때 복사하고 싶습니다.

답변:


69

오류 메시지에 대해 이야기하는 경우 비트 버킷으로 보내서이를 억제 할 수 있습니다.

cp ./src/*/*.h ./aaa 2>/dev/null

종료 코드 및 오류 메시지를 표시하지 않으려면 다음을 수행하십시오.

cp ./src/*/*.h ./aaa 2>/dev/null || :

8
:이 맥락에서 의미 하는 바를 설명하는 것이 좋을 것 입니다.
Piotr Dobrogost

23
@PiotrDobrogost : Bash와 다른 쉘에서 콜론은 널 유틸리티 (no-op)입니다. 그것은 것 지정 에 의해 POSIX . 항상 true를 리턴하므로 여기에서 실패의 종료 코드를 억제하는 데 사용됩니다 cp(원하는 경우). 쉘 내장을 true대신 사용할 수 있으며 더 읽기 쉽습니다.
Dennis Williamson


1
이것은 또한 다른 오류 (소스 / 대상 디렉토리가 존재하지 않는, 소스 파일, 디스크 전체 읽기 전용 파일 시스템, IO 오류가 존재하지만 읽을 수없는 무시 cp에없는 PATH어떻게 든 ...)
블라디미르 Panteleev

예기치 않은 토큰`|| '근처의 구문 오류
감사합니다

13

당신은 라인을 따라 뭔가를 찾고 있습니다

if [ -e file ]
 then cp file /somewhere
fi

(불행히도, -f옵션은 당신이 찾고있는 드로이드가 아닙니다.)

글로브와 일치 시키려면 작동하지 않습니다. 사용하는 find대신에, 예를 들면 :

find ./src -name \*.h -exec cp {} ./destination \;

이러한 접근 방식에는 TOCTOU 문제가있을 수 있습니다 (예 :을 사용 하고 호출 set -e간에 파일이 사라지면 스크립트가 중단됨). [cp
Vladimir Panteleev

9

오래된 질문이지만 여전히 다른 사람들과 관련이있을 수 있습니다. cp를 사용할 필요
가 없으면 rsync를 사용해보십시오. 소스에서 대상 디렉토리로 모든 파일을 복사하려면 다음을 실행하십시오.

rsync -avzh --ignore-errors /path/to/source /path/to/destination

Rsync는 Linux, Mac OS X 또는 FreeBSD와 같은 대부분의 유닉스 계열 시스템과 함께 제공됩니다.


4
매개 변수를 추가하여 cp 대신 rsync를 사용할 수 있습니다 --ignore-missing-args. rsync -av --ignore-missing-args ./src/*/*.h ./aaa이는 --ignore-errors존재하지 않는 소스 파일과 관련된 오류 만 무시한다는 장점이 있습니다 . 으로 --ignore-errors모든 오류가 무시되고 위험 할 수있다. 또한이 매개 변수가 최신 버전이므로 이전 버전의 rsync에는 없을 수 있습니다.
jesjimher

6

결과를 true로 파이프하면 명령이 항상 성공합니다. Linux에서는 시도했지만 Mac OS에서는 시도하지 않았습니다.

cp ./src/*/*.h ./aaa | true

5
단순 파이프 |는 항상 실행되는 동안 ||오류가 발생한 경우에만 수행됩니다. 그리고 true콜론 동안 일반적으로 이진 :내장 명령이며, PID를 소비하지 않습니다.
ott--

"cp ./src/*/*.h ./aaa"명령을 포함하는 MacOS-Yosemite의 bash 스크립트는 .h 파일이 없으면 오류가 발생하지 않습니다.
Vivek

2

올바른 오류 상태를 강요 할 수 있습니다. 기능으로 :

$ 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.