tar는 특정 디렉토리를 제외하지만 하위 디렉토리는 제외하지 않습니다.

tar는 특정 디렉토리를 제외하지만 하위 디렉토리는 제외하지 않습니다.

많은 네트워크 디렉터리를 다른 컴퓨터로 전송해야 합니다. 디렉토리 구조는 다음과 같습니다.

/var/www/
    site1/
        cgi-bin/ ...
        logs/ ...
        index.html
        images/ ...
        ...
    site2/
        cgi-bin/
        logs/
        ...
    size3/
    ...

사용하려는 파일을 패키지하려면 tar. 모든 "cgi-bin" 및 모든 "logs" 디렉터리를 제외한 모든 파일을 패키지해야 합니다.오직하위 디렉터리가 아닌 일부 제공된 경로에 있습니다!

이러한 디렉터리는 대상에 존재하지 않아야 하고 크기가 매우 클 수 있으므로 패키징에서 제외해야 합니다. 이로 인해 전송 속도가 느려집니다. 그래서 나는원하지 않는다포함하고 대상에만 제거하고 싶습니다.

나는 여러 가지 조합을 시도했습니다.

cd /var/www
tar cfz ~/web.tgz site* --exclude-from excludes.list

Excepts.list는 다음과 같은 줄을 포함하는 파일입니다. (예제는 다양한 경로 스타일을 보여줍니다. 파일 전체에서 각 경로 스타일을 일관되게 사용했지만 변형은 작동하지 않았습니다.)

site1/cgi-bin
site1/logs
./site2/cgi-bin
/var/www/site2/logs

"cgi-bin" 디렉터리는 다른 하위 디렉터리에 나타날 수 있으며(명령어를 사용하여 나열 find) 제외하려는 "logs" 디렉터리는 각 "사이트"에 직접 있습니다.엑스” 디렉터리. 기타 “로그” 디렉터리반드시 포함되어야 한다.

두 가지 결과만 얻을 수 있습니다.

  1. 파일이 전혀 제외되지 않습니다
  2. 모든 디렉토리부분적으로/var/www/site2/bla/site1/logs/ 등 일치하는 제외 패턴은 제외됩니다. 이는 받아들일 수 없는 일이기 때문에너무 많이 제외하다.

tar제공된 제외 패턴처럼 보이는 다른 부분 없이 제공된 절대 경로를 완전히 제외하는 방법이 있습니까 ?

답변1

프로세스 대체를 사용하고 find제외할 디렉터리 목록을 작성할 수 있습니다. 귀하의 구현이 다음 옵션을 지원한다고
가정합니다 .find-maxdepth

cd /var/www
tar cfz ~/web.tgz --exclude-from=<(
  find site* -maxdepth 1 -type d -name 'logs'
  find site* -type d -name 'cgi-bin'
) site* 

테스트 설정:

site1/
├── cgi-bin
│   └── file1
├── images
│   ├── cgi-bin
│   │   └── file2
│   └── logs
│       └── file3
├── index.html
└── logs
    └── file4

산출:

$ tar cvfz ~/web.tgz --exclude-from=<(
  find site* -maxdepth 1 -type d -name 'logs'
  find site* -type d -name 'cgi-bin'
) site*
site1/
site1/images/
site1/images/logs/
site1/images/logs/file3
site1/index.html

제외된 디렉터리(두 명령의 출력 find):

site1/logs
site1/cgi-bin
site1/images/cgi-bin

관련 정보