도트 파일을 포함할 때 tar 오류가 발생함

도트 파일을 포함할 때 tar 오류가 발생함

일부 파일을 압축해야 하는데 그 중 하나가 도트 파일입니다.

FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml

FILES="${FILE1#/} ${FILE2#/}"

tar -C / -cf /tmp/foo/files.tar "$FILES"

변수 대체는 tar: Removing leading '/' from member names경고를 방지하고 압축 풀기 프로세스를 단순화합니다.

하지만 다음 오류가 발생합니다.

tar: tmp/foo/.env tmp/foo/docker-compose.yml: 계산할 수 없음: 해당 파일이나 디렉터리가 없습니다.

하드코딩된 경로는 유효합니다: tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml.

그렇다면 문제는 도트 파일을 처리하는 데 있는 것인가요, 아니면 이스케이프와 관련이 있는 것인가요?

답변1

쉘이 확장되면 "$FILES"공백은 문법적 가치를 잃습니다. 따라서 명령은 tar단일 경로로 수신됩니다.tmp/foo/.env tmp/foo/docker-compose.yml

좋다

file='a b'
touch "$file"

a b두 개의 파일 대신 파일을 생성 a하고 b.

따라서 주석에서 제안한 대로 파일마다 다른 변수를 사용해야 합니다 tar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}".


직접 실행하면 작동하는 이유 tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml는 공백이 하나의 매개변수를 다른 매개변수와 구분하는 구문적 값을 갖기 때문입니다. "사람의 눈"에는 "$FILES"확장 시 동일한 공간이 생성되지만 tmp/foo/.env tmp/foo/docker-compose.yml이 경우 공간은 참조로 인해 특별한 의미가 없으므로 전체 값이 단일 경로로 간주됩니다.

관련 정보