Linux Bash 스크립트에서 부정이 포함된 파일 찾기

Linux Bash 스크립트에서 부정이 포함된 파일 찾기

내 Linux 폴더에 다음 파일이 있습니다.

abc.txt
test.log
kkk.war
Type1_20160814.xml
Type1_20160624.xml
Type1_20160703.xml
Type1_20160503.xml

Type1 파일을 gzip하고 싶습니다.아니요현재 달인 8월에 속합니다(mtime을 사용할 수 없습니다).

예상되는 결과는 다음 파일이 gzip으로 압축된 것입니다.

Type1_20160624.xml
Type1_20160703.xml
Type1_20160503.xml

실제로 나는 시도했다:

files=$(find . -maxdepth 1 -mindepth 1 -not -type f -name "Type1_201608*.xml")
gzip -5 ${files[@]}

그러나 이는 Type1 gzip 파일(아래 표시)도 아닙니다. 이를 방지하려면 어떻게 해야 합니까?

abc.txt
test.log
kkk.war

답변1

find . -maxdepth 1 -mindepth 1 -not -type f -name "Type1_201608*.xml"

즉, 현재 디렉터리( )에 있는 파일의 경우 이름이 일치하는 . -maxdepth 1 -mindepth 1비정규 파일( )을 나열합니다 .-not -type f"Type1_201608*.xml

일치하는 파일만 나열하려고 하므로 Type1_*.xml명령에 이 패턴이 어딘가에 포함되어야 합니다! 일반 파일에 대해 작업하고 싶으므로 -type f.

find . -maxdepth 1 -mindepth 1 -type f -name "Type1_*.xml" ! -name "Type1_201608*.xml"

출력을 구문 분석하지 않습니다.find. 를 사용하세요 -exec. 그게 바로 그 용도입니다.

find . -maxdepth 1 -mindepth 1 -type f -name "Type1_*.xml" ! -name "Type1_201608*.xml" -exec gzip -5 {} +

최신 셸에서는 Type1_*.xml제외하려는 디렉터리나 심볼릭 링크와 패턴이 일치하지 않는 경우 find이 작업을 수행할 필요가 없습니다. ksh의 확장된 glob 패턴을 사용할 수 있습니다.배쉬에서도 사용 가능.

shopt -s extglob
gzip -5 Type1_!(201608*).xml

zsh에서는 ksh 확장 글로벌 모드를 활성화할 수 있지만 다음을 사용할 수도 있습니다.zsh 자신의.

setopt extended_glob
gzip -5 Type1_*.xml~Type1_201608*

또는

gzip -5 Type1_(^201608*).xml

그리고 zsh에서 일반 파일만 일치하는지 확인하려면 다음을 사용할 수 있습니다.글로벌 예선.

setopt extended_glob
gzip -5 Type1_(^201608*).xml(.)

답변2

bash쉘 옵션 세트와 함께 사용 extglob:

$ shopt -s extglob

$ echo Type1_????!(08)??.xml
Type1_20160503.xml Type1_20160624.xml Type1_20160703.xml

$ gzip Type1_????!(08)??.xml

!(something)패턴은 무엇이든 일치합니다와는 별개로 something.

ksh이는 (이 구문의 소스) 에도 적용됩니다 .아니요기본값이 아닌 옵션을 설정합니다.

답변3

작업 디렉터리에서 다음 명령을 실행해 보았더니 모든 파일이 압축되었습니다.

같은 디렉토리에서 실행

gzip -f $(ls -l | grep Type1 | grep -v $(date+%Y%m) | awk '{print $NF}')

ls의 다른 디렉터리에서 실행하려면 폴더 이름을 매개변수로 추가해야 합니다.

gzip -5 $(ls -lrt -d -1 test/* | grep Type1 | grep -v $(date +%Y%m) | awk '{print $NF}')

수신된 출력

Type1_20160102.xml.gz

1_20160105.xml.gz를 입력하세요.

1_20160624.xml.gz를 입력하세요.

1_20160703.xml.gz를 입력하세요.

1_20160704.xml.gz를 입력하세요.

1_20160705.xml.gz를 입력하세요.

이 명령은 이번 달의 파일을 제외하고 Type1 디렉터리 이름의 모든 파일을 압축합니다.

관련 정보