내 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 디렉터리 이름의 모든 파일을 압축합니다.