복사본에 파일이 없으면 개발자에게 null을 보내는 대신 오류를 표시하지 않습니다.

복사본에 파일이 없으면 개발자에게 null을 보내는 대신 오류를 표시하지 않습니다.

존재하지 않는 파일을 cp로 처리하려고 하면 스크립트에서 오류가 발생하는 것을 방지하고 싶습니다. 하지만 권한 부족 등 다른 오류에 대해서는 오류 메시지를 인쇄하고 싶습니다. 이는 dev/null에 메시지를 보낼 수 없음을 의미합니다. 스크립트에서 이 작업을 수행할 수 있는 다른 솔루션은 무엇입니까?

한 가지 옵션은 복사하기 전에 파일이 존재하는지 확인하기 위해 if 문을 사용하는 것이지만 이 접근 방식은 다소 혼란스러워 보입니다. 파일 이름에 *를 추가하면 원하는 것을 얻을 수 있다고 생각합니다. 비록 이상한 방법처럼 보이지만요. 내가 원하는 것을 얻을 수 있는 명령줄 인수나 다른 방법이 있습니까?

답변1

당신은 다음을 좋아할 것입니다:

{ command <doesntexist cp doesntexist 2>&3 ; } 3>&2 2>/dev/null

서브 쉘에서는 더 짧을 수 있습니다 ...

( <file cp file ... 2>&3 ) 3>&2 2>/dev/null

하지만 아직은 멀은 것 같습니다...

[ -r file ] && cp file ...

이 모든 파일은 읽기 가능한 테스트 파일입니다. 디렉토리에서는 작동하지 않습니다.

하지만...

[ -e file ] && cp file ...

...할 수 있다...

답변2

존재하는지 확인하면 문제가 줄어들지만 가장 일반적인 경우에는 경쟁 조건입니다. 확인과 복사 시도 사이에도 파일을 삭제할 수 있습니다.

어쩌면 모든 오류를 포착하고 "파일이 존재하지 않습니다" 오류를 제거할 수도 있습니다.

일반 사본:

$ cp noexist bar /tmp
cp: cannot stat `noexist': No such file or directory
cp: cannot open `bar' for reading: Permission denied

수정됨

$ cp noexist bar /tmp 2>&1 | grep -v "No such file or directory" >&2
cp: cannot open `bar' for reading: Permission denied

답변3

그냥 확인해보세요만약에디렉터리/파일이 이미 존재합니다:

  • 복사하다문서

    file=path/to/the/file/to/copy && [ -f "${file}" ] && cp ${file} destination/path/here

  • 복사하다목차

    dir=path/to/the/dir/to/copy && [ -d "${dir}" ] && cp -r ${dir} destination/path/here

노트:

공간전 후대괄호는 필수이며 위의 명령을 위반하지 않습니다.

인용하다: https://linuxize.com/post/bash-check-if-file-exists/

관련 정보