각각 크기가 약 10GB인 약 20개의 파일이 서로 다른 폴더에 있는데 이를 tar로 압축해야 합니다. 모든 항목을 한 위치에 복사하는 것은 비현실적입니다. 보다 정확하게는 이러한 파일은 다음과 같이 구성됩니다.
index1_index2/하위 폴더/bigfile.dat
여기서 index1과 index2는 각각 서로 다른 값을 갖습니다.
bash 등을 사용하는 것처럼 이러한 모든 파일을 포함하는 단일 타르볼을 얻는 실용적인 방법은 무엇입니까?
답변1
동일한 파일 시스템에 있는 경우 공통 디렉토리 및 tar에 하드 링크할 수 있습니다.저것목차.
또는 GNU tar를 사용하는 경우 (좀 더 유연하게) 공용 디렉토리에 소프트 링크하고 -h
tar의 옵션을 사용하여 가리키는 파일을 소프트 링크할 수 있습니다.
매뉴얼 페이지후자는 보여줍니다:
-h
,--dereference
심볼릭 링크를 따라가며 해당 링크가 가리키는 파일을 덤프합니다.
FreeBSD 타르동등한 옵션이 지원되지만 이름이 지정됩니다 pax
(아래 참조).
물론 비교할 POSIX tar는 없습니다. 당신이 사용할 수 있다면pax
, 비슷한 -L
옵션이 있습니다.
-L
디렉토리 유형의 파일을 참조하는 기호 링크가 명령줄에 지정되거나 파일 계층을 탐색하는 동안 기호 링크가 발견되면pax
링크에서 참조하는 파일을 루트로 하는 파일 계층을 다음과 같은 링크 이름을 사용하여 보관해야 합니다. 루트 파일 계층 구조. 그렇지 않고pax
일반적으로 보관되는 다른 파일 형식의 파일을 참조하는 기호 링크가 명령줄에 지정되거나 파일 계층 구조를 탐색하는 동안 발견되는 경우pax
링크에서 참조하는 파일은 링크 이름을 사용하여 보관되어야 합니다. 둘 다 아닐 때의 기본 동작-H
또는-L
지정하면 심볼릭 링크 자체가 보관되어야 합니다.
하드 링크이든 소프트 링크이든 결과적으로 기존 파일을 이동할 필요가 없습니다. 하드 링크다양성(타임스탬프 ctime
) 파일이지만 소프트 링크는 아닙니다. 그러나 동일한 옵션을 사용하는 tar 구현에서는 소프트 링크가 보편적으로 지원되지 않습니다(동일한 파일 시스템에 있어야 할 필요성은 줄어들지만).
OP의 원래 진술은 모든 파일을 하나의 디렉토리에 넣는 것이 불편한 이유가 파일을 생성하는 응용 프로그램의 일부 제한 때문임을 나타내는 것 같습니다. 명확히 한 후에 문제는 모두 동일한 파일 이름을 가지고 있다는 것이 분명해졌습니다. 디렉터리에 연결할 때(예: 원래 디렉터리 인코딩)디렉토리 이름공통 위치로)는 확실히 가능하지만 파일을 단일 아카이브로 수집하고 기존 디렉터리 이름을 유지하는 다른 옵션이 있습니다. 이 방법의 한 가지 단점은 모든 위치로 복원하는 기능이 제한된다는 것입니다. 그러나 tar에 약 20개의 이름을 전달하는 가장 쉬운 방법은 명령줄을 사용하는 것입니다.
`tar czf myoutput.tar.gz $(find . -type f -name bigfile.dat)`
파일이 20개뿐이므로 명령줄 길이 문제가 아닐 가능성이 높습니다. tar
구현 시 별도의 명령줄 인수가 아닌 경로 이름 목록을 전달하는 기능이 부족한 경우가 많기 때문에 파일 수가 많거나 경로 이름이 매우 긴 경우 작업이 더 어려워집니다 (참조).솔라리스예를 들어). 이러한 경우 아카이브를 점진적으로 생성하여 이 제한 사항을 해결하려고 시도할 수 있지만 압축에서는 작동하지 않습니다. 일부 구현에서는 파일에서 파일 이름 목록을 읽는 옵션을 제공합니다. 이것GNU 타르-T
(또한 FreeBSD) 옵션이 이를 수행할 수 있습니다. 다른 프로그램에서는 표준 입력에서 파일 이름 목록을 읽는 세 번째 옵션을 제공할 수 있습니다(예:공원, 이는 다음의 영향을 받았습니다.CPIO), 그러나 일반적으로 tar는 그렇지 않습니다. 파일을 읽을 수 있습니다.콘텐츠표준 입력에서.
답변2
가장 직접적인 방법은 다음과 같습니다.
tar cfz bigtar.tar.gz /path/to/file1 /path/to/file2 ... /path/to/file20
대상 파일 간에 일치하는 유사성이 있으면 GNU의 ()를 사용하여 find
파일 목록을 만들 수 있습니다.tar
-T
--files-from
예를 들어, 둘 다 .mp4 파일인 경우:
find /path -type -f -iname '*.mp4' | tar cf bigtar.tar -T -
그렇지 않고 파일 이름을 선택하는 쉬운 패턴이 없는 경우 find를 사용하여 tmpfile에 초기 목록을 만들고 해당 목록을 수동으로 편집하여 tar에 포함하지 않으려는 파일 이름을 제거한 다음 해당 파일의 이름을 사용할 수 있습니다. tmpfile을 tar Options로 편집했습니다 -T
.