존재하지 않는 파일을 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
노트:
공간전 후대괄호는 필수이며 위의 명령을 위반하지 않습니다.