tar에서 stdout으로: PIPESTATUS에 영향을 주지 않고 입력 파일을 잃습니다.

tar에서 stdout으로: PIPESTATUS에 영향을 주지 않고 입력 파일을 잃습니다.

다음 콘텐츠가 포함된 폴더가 있습니다(하위 폴더와 파일 이름은 고정되어 있으며 변경할 수 없습니다).

# ls
data/ config/ myfile

tar 아카이브를 만들어야 합니다.표준 출력dd단순화를 위해 Bash 스크립트에서 처리합니다.

# /bin/tar -cz data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

이 명령 직후에 작업이 성공했는지 ${PIPESTATUS[0]}확인하기 위해 변수가 0인지 확인합니다.tar

문제는 그렇다는 것이다 myfile.임의로 선택할 수 있는나에게는 그것이 없으면 ${PIPESTATUS[0]}버그로 보고 싶지 않지만 그것이 없으면 2가 된다. 그렇다면 tar누락된 입력 파일을 무시하도록 어떻게 지시합니까 ? 가능하다면 한 줄짜리 진술을 선호합니다.

답변1

그렇다면 누락된 입력 파일을 무시하도록 tar에 어떻게 지시합니까?

매우 간단합니다. --ignore-failed-read명령에 플래그를 사용 하면 됩니다 tar.

$/bin/tar -cz --ignore-failed-read data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

$ echo ${PIPESTATUS[0]}

> 0

그런데: 대답은 참고하세요하우크라그더 번거롭지만 tar모든 것이 정상이거나 유일하게 누락된 파일이 있는 경우에만 0을 반환합니다 myfile. tar모든 것이 정상이거나 파일이 누락된 경우에도 0을 반환합니다.


이것으로:

/bin/tar -cz --ignore-failed-read data config myfile | /bin/dd of=backup.tar 2>/dev/null

stderr(나는 으로 리디렉션하지 않았다는 점에 유의하십시오 tar) 존재하지 않으면 /dev/null반환 하고 (물론 다른 오류가 없는 경우) 다음을 얻습니다 .myfiletar0stderr/bin/tar: myfile: Warning: Cannot stat: No such file or directory

tar설명서에는 다음과 같이 나와 있습니다.

'--ignore-failed-read' 읽을 수 없는 파일이나 디렉터리에서 0이 아닌 값으로 종료하지 마십시오. 이 옵션은 생성 중에만 유효합니다. 이는 누락되거나 읽을 수 없는 파일(디렉토리)을 부 파일로 처리하도록 tar에 지시합니다. 이러한 실패는 프로그램 종료 코드에 영향을 주지 않으며 해당 진단 메시지는 오류가 아닌 경고로 표시됩니다. 이러한 경고는 "--warning=failed-read" 옵션을 사용하여 억제할 수 있습니다.

하지만 아쉽게도 --warning=failed-read읽기 오류에 대한 모든 경고를 억제합니다. 귀하의 경우에는 존재하지 않는 파일에 대한 경고도 억제하고, 읽기 오류에 대한 경고도 억제합니다.입출력 오류, 예를 들어... 최적과는 거리가 멀습니다. 분명히 tar다음과 같은 플래그가 하나도 없습니다.안녕하세요, 파일이 존재하지 않는 경우에만 읽기 실패 경고를 억제하세요, 이렇게 하면 문제가 해결될 수 있습니다.

/bin/tar -cz --ignore-failed-read data config myfile 2> >(grep -v 'No such file or directory' 1>&2) | /bin/dd of=backup.tar 2>/dev/null

이것은>( ... )프로세스 교체

이렇게 하면 tail파일이 존재하지 않는 경우 명령이 반환 번호를 변경하지 않고 누락된 파일에 대한 경고 메시지를 받지 않으며 기타 읽기 오류에 대한 경고 메시지를 받습니다.


이>

저는 이러한 솔루션 중 어느 것도 그다지 좋지 않다고 생각하지 않을 수 없었습니다. 그래서 저는 다음과 같은 결론을 내렸습니다.

/bin/tar -cz -T <(\ls -A -1) 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

이 방법을 사용하면 tar명령이 실행될 때 실제로 존재하는 파일에만 보낼 수 있습니다. 해당 파일의 이름이나 심지어 어떤 파일이 존재하는지 또는 존재하지 않는지에 대해 걱정할 필요가 없습니다. 항상 동일한 명령을 실행합니다(무슨 일이 있어도). 파일 1개가 누락되었습니다. 완벽하게 확장할 수 있습니다. 또는N파일이 손실되어 오류를 놓치지 않습니다.

(알아채다백슬래시if 명령 앞에 ls: 이렇게 하면 ls앨리어싱을 방지할 수 있으므로 출력이 더 안정적입니다.)

답변2

tar통화를 변경할 수 있는 옵션이 있는 경우 :

test -e myfile && myfile=myfile || myfile=
/bin/tar -cz data config $myfile 2>/dev/null |

관련 정보