정규식 및 zip 명령을 사용한 디렉터리 제외

정규식 및 zip 명령을 사용한 디렉터리 제외

내 응용 프로그램을 압축하려고 하는데 하나를 제외한 모든 이미지 디렉터리를 제외하고 싶습니다.

다음 폴더 구조를 고려하세요.

/images
└───/foo // exclude
└───/bar // exclude
└───/foobar // exclude
└───/icons // include

내가 이해한 바로는 이 zip명령은 인수에 정규식을 허용하지 않으므로 어떻게 해야 할지 모르겠습니다.

저는 몇 가지 조사를 해본 결과 이를 수행할 수 있는 방법이 있다고 믿습니다. ls/ find그러나 방법은 완전히 모르겠습니다. 누구든지 나에게 무엇을 해야할지 제안할 수 있나요?

이것은 내 현재 명령입니다(제외모두이미지 디렉토리):

zip -rq application.zip . -x vendor/\* node_modules/\* .git/\* .env public/assets/images/\*

나는 이와 같은 것이 필요하다고 생각합니다 (아직 실제로 작동하는 정규식을 얻지 못했습니다).

find ./public/assets/images -maxdepth 1 -regex '\.\/(?!icons).* | zip -rq application.zip . -x vendor/\* node_modules/\* .git/\* .env INSERT_FIND_RESULTS_HERE

고쳐 쓰다

전체 애플리케이션 디렉터리는 다음과 유사합니다.

/www
│   .env
│   .env.example
│   .env.pipelines
│   .gitignore
│   artisan
│   etc...
└───/.ebextensions
└───/.git
└───/app
└───/bootstrap
└───/config
└───/database
└───/infrastructure
└───/node_modules
└───/public
│   │   .htaccess
│   │   index.php
│   │   etc...
│   │
│   └───/assets
│   │   └───/fonts
│   │   └───/images
│   │   │   └───/blog
│   │   │   └───/brand
│   │   │   └───/capabilities
│   │   │   └───/common
│   │   │   └───/contact
│   │   │   └───/icons
│   │   │   └───/misc
│   │   │   └───etc...
│   │
│   └───/js
│   └───/css
└───/storage
└───/tests
└───/vendor

다음을 제외한 모든 파일을 압축하고 싶습니다.

vendor/
node_modules/
.git/
.env
public/assets/images/ (excluding public/assets/images/icons)

업데이트 2

find게시한 이후 정규 표현식이 미리보기를 허용하지 않으므로 grep찾기와 찾기를 조합 하여 사용해야 한다는 사실을 알게 되었습니다 . 그래서 여기에 내 최신 명령이 있습니다(그래도 여전히 작동하지 않습니다).

find ./public/assets/images -maxdepth 1 -regex '\./public/assets/images/.*' | grep -oP '\./public/assets/images/(?!icons).*' | xargs zip -rq application.zip . -x vendor/\* node_modules/\* .git/\* .env

참고로 나는 그것을 어떻게 사용하는지 모른다 xargs. 이것이 위의 방법이 예상대로 작동하지 않는 이유라고 생각한다.

답변1

내 제안은 두 단계로 아카이브를 만드는 것입니다.

  1. 제외하려는 모든 항목을 제외하는 아카이브를 만듭니다.

    zip -r application.zip . -x 'vendor/*' 'node_modules/*' '.git/*' .env 'public/assets/images/*'
    
  2. 제외된 디렉터리에서 포함하려는 폴더 하나를 동일한 아카이브에 추가합니다.

    zip -r application.zip public/assets/images/icons/
    

(기본 동작은 zip파일이 이미 존재하는 경우 기존 아카이브에 추가하는 것입니다.)

답변2

다음 명령을 실행해 보십시오.

find /www \( -path "*/public/assets/images/*" -a  \( ! -path "*/public/assets/images/icons" -a ! -path "*/public/assets/images/icons/*" \) \) -o \( -path "*/.git*" \) -o \( -path "*/vendor*" \) -o \( -path "*/node_modules*" \) -prune -o \( ! -name ".env" \) -exec zip www.zip {} +

설명하다

매개변수 뒤에서 시작 /www하고 매개변수로 끝나는 첫 번째 표현식 은 -prune디렉토리를 나타내며 제외 .git는 무시 됩니다 .vendornode_modulespublic/assets/imagespublic/assets/images/iconsfind

! -name ".env"find에게 이름이 지정된 파일을 무시하도록 지시합니다..env

-exec zip www.zip {} +선택한 파일에 대해 명령을 실행 zip하지만 명령줄은 선택한 각 파일 이름을 끝에 추가하여 구성됩니다. 명령의 총 호출 수는 일치하는 파일 수보다 훨씬 적습니다. 결과는 파일에 저장됩니다 www.zip.

관련 정보