많은 네트워크 디렉터리를 다른 컴퓨터로 전송해야 합니다. 디렉토리 구조는 다음과 같습니다.
/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" 디렉터리는 각 "사이트"에 직접 있습니다.엑스” 디렉터리. 기타 “로그” 디렉터리반드시 포함되어야 한다.
두 가지 결과만 얻을 수 있습니다.
- 파일이 전혀 제외되지 않습니다
- 모든 디렉토리부분적으로/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