*/*/.thisdirectory/*
tar 아카이브에 일치하는 파일을 포함하려고 합니다 . 올바른 구문은 무엇입니까? 분명히 이것은 그렇지 않습니다:
> find .
.
./bar
./bar/.a
./bar/.a/baz
./foo
./foo/.a
> tar --include "*[.]a*" -cvf a.tar .
>
답변1
나는 당신이 FreeBSD tar1을 사용하고 있다고 가정합니다. 그것이 내가 아는 유일한 --include
구현이기 때문에 옵션이 있기 때문입니다.
이를 전달하면 --include
명시적으로 포함된 파일만 탐색됩니다. 아카이브를 구축할 때 디렉터리를 순회하지 않으면 디렉터리나 그 내용이 포함될 수 없습니다. 압축 .
하지만 포함하지 않기 때문에 .
고유한 명령줄 인수는 포함되지 않고 빈 아카이브를 얻게 됩니다.
.a
디렉터리에 액세스하려면 모든 상위 디렉터리를 포함해야 합니다. 문제는 이렇게 하면 해당 내용도 모두 포함된다는 것입니다. 를 사용하여 제외 할 수 있지만 --exclude
포함하려는 포인트 디렉터리를 제외하지 않는 제외 패턴이 필요합니다. 현재로서는 --include
아무 소용이 없습니다 . 이 --include
옵션은 아카이브를 생성할 때 거의 유용하지 않으며 기존 아카이브의 일부를 복사할 때 더 유용합니다(이 작업을 수행할 때 재귀 순회가 없고 입력 아카이브의 멤버 목록에 대한 반복만 수행되기 때문입니다).
tar --exclude='./*/[!.]*' -cvf a.tar .
최상위 디렉터리의 모든 파일이 포함됩니다. 비어 있지 않은 콘텐츠가 있는 디렉토리만 포함하는 방법은 없다고 생각합니다.
./*/.*
디렉터리 만 가져오고 다른 것(특히 부모 디렉터리는 제외)을 얻으려면 tar가 재귀적으로 디렉터리를 찾도록 하는 대신 tar에 인수로 전달해야 합니다.
tar -cvf a.tar ./*/.[!.]*/
디렉토리(또는 디렉토리에 대한 심볼릭 링크)가 아닌 파일을 포함하려면 후행 슬래시를 제거하십시오. ./*/..?*/
포함된 이름으로 시작하는 디렉터리가 ..
있으면 추가합니다 .
¹ 다른 운영 체제에서 발생할 수 있습니다.
답변2
쉘이 bash인 경우 이 변수를 사용하여 디렉토리 를 GLOBIGNORE
숨길 수 있습니다 . 또한 숨겨진 파일과 숨겨지지 않은 파일이 일치하도록 옵션이 자동으로 설정됩니다..
..
dotglob
*
GLOBIGNORE=".:.."
tar czf tarball-with-hidden-files.tgz directory/*
조금 확장하려면: 기본적으로 *
숨겨진 파일( 로 시작하는 파일)은 일치하지 않습니다 . 여기에는 현재( ) 디렉터리와 .
모든 디렉터리의 .
상위( ) 디렉터리가 포함됩니다. ..
glob(예: 명령줄 와일드카드)을 일치시키려면 해당 옵션을 설정해야 dotglob
하지만 이로 인해 다음과 같은 결과가 발생할 수 있습니다.진짜..
일치하는 항목이 있고 *
그런 작업을 수행하면 뭔가 나쁜 일이 발생할 것입니다 ( 일치 rm -fr /home/olduser/*
로 인해 이제 모든 사람의 홈 디렉토리가 튀겨졌습니다. 이것이 시작되는 곳입니다. 와일드카드와 일치하는 콘텐츠를 블랙리스트에 추가합니다. 매우 간단한 사용 사례:olduser/..
/home/
GLOBIGNORE
ghoti@home:~/scratch$ ls -ld ?dotfile
ls: cannot access '?dotfile': No such file or directory
ghoti@home:~/scratch$ touch _dotfile .dotfile
ghoti@home:~/scratch$ ls -ld ?dotfile
-rw-rw-r-- 1 ghoti ghoti 0 May 6 16:58 _dotfile
ghoti@home:~/scratch$ GLOBIGNORE=".:.."
ghoti@home:~/scratch$ ls -ld ?dotfile
-rw-rw-r-- 1 ghoti ghoti 0 May 6 16:58 _dotfile
-rw-rw-r-- 1 ghoti ghoti 0 May 6 16:58 .dotfile
이것이 당신에게 무엇을 의미합니까? 글쎄, 이 답변 상단의 빠른 예에서 볼 수 있듯이 일단 GLOBIGNORE
무시하도록 설정 .
하고 이를 사용하여 보관하려는 디렉터리와 같은 숨겨진 디렉터리를 일치시킬 ..
수 있습니다 .*
tar czf mytarball.tgz directory/* # this will include things like directory/.hiddenfile
다음과 같은 디렉터리를 가리키는 구체적인 예 .a
:
ghoti@home:~/scratch$ mkdir -p example example/foo/.a example/bar/.a example/foo/_a example/bar/_a
ghoti@home:~/scratch$ touch example/{foo,bar}/{.,_}a/file
ghoti@home:~/scratch$ find example/
example/
example/foo
example/foo/_a
example/foo/_a/file
example/foo/.a
example/foo/.a/file
example/bar
example/bar/_a
example/bar/_a/file
example/bar/.a
example/bar/.a/file
ghoti@home:~/scratch$ GLOBIGNORE=".:.."
ghoti@home:~/scratch$ tar cvzf withdotfiles.tgz example/*/?a
example/bar/_a/
example/bar/_a/file
example/bar/.a/
example/bar/.a/file
example/foo/_a/
example/foo/_a/file
example/foo/.a/
example/foo/.a/file
ghoti@home:~/scratch$ unset GLOBIGNORE
ghoti@home:~/scratch$ tar cvzf withoutdotfiles.tgz example/*/?a
example/bar/_a/
example/bar/_a/file
example/foo/_a/
example/foo/_a/file
답변3
그러나 여기서는 오래된 말에 올라타는 것보다 tar를 사용하여 이 작업을 수행해야 한다는 명백한 "예상" 방법에 대한 증거를 지적하는 사람을 찾을 수 없기 때문에 다음과 같습니다.
다른 곳에서 지적했듯이 문제는 tar가 "--include"를 문자 그대로 받아들이고 --include가 파일을 먼저 필터링하면 .a 파일을 찾기 위해 foo 및 bar 디렉토리를 순회하지 않는다는 것입니다.
tar /is/ 사용 요령에 대한 단서는 매뉴얼 페이지에 포함되어 있지만 상당히 혼란스럽습니다. --include는 기존 아카이브를 필터링하는 데 사용되는 것으로 "가정"되며 tar를 읽게 하는 마법 매개변수 @-도 있습니다. from STDIN 검색된 데이터는 기존 아카이브에서 읽은 데이터로 처리됩니다.
요약하자면, 뒤죽박죽된 tar 문을 사용하여 현재 디렉터리에 있는 모든 항목의 아카이브를 만들고 이를 STDOUT에 채울 수 있습니다. 그런 다음 --include 옵션을 사용하는 tar로 파이프합니다.그리고STDIN에서 읽습니다.
귀하의 경우에는 다음과 같습니다.
tar-cf-/ | tar -cf myfiles.tar --include=". ㅏ"@-
Soyokaze:test$ ls -lR
total 32
drwxr-xr-x 6 tyler staff 204 Nov 29 14:24 bar/
drwxr-xr-x 4 tyler staff 136 Nov 29 14:23 foo/
./bar:
total 0
-rw-r--r-- 1 tyler staff 0 Nov 29 14:23 baa.a
-rw-r--r-- 1 tyler staff 0 Nov 29 14:23 baaa.a
-rw-r--r-- 1 tyler staff 0 Nov 29 14:23 baz
drwxr-xr-x 2 tyler staff 68 Nov 29 14:24 boos/
./bar/boos:
total 0
./foo:
total 0
-rw-r--r-- 1 tyler staff 0 Nov 29 14:23 baa.a
-rw-r--r-- 1 tyler staff 0 Nov 29 14:23 baz.a
Soyokaze:test$ tar -cf - */ | tar -cf myfiles.tar --include="*.a" @-
Soyokaze:test$ tar -tf myfiles.tar
bar/baa.a
bar/baaa.a
foo/baa.a
foo/baz.a