我的linux文件夹中有以下文件:
abc.txt
test.log
kkk.war
Type1_20160814.xml
Type1_20160624.xml
Type1_20160703.xml
Type1_20160503.xml
我想要 gzip Type1 文件不是属于当月,即八月(我不能使用 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 {} +
对于现代 shell,如果模式Type1_*.xml
与您想要排除的任何目录或符号链接都不匹配,则无需执行find
此操作。您可以使用 ksh 扩展的 glob 模式,它们是也可在 bash 中使用。
shopt -s extglob
gzip -5 Type1_!(201608*).xml
在 zsh 中,您可以启用 ksh 扩展 glob 模式,但也可以使用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
与shell 选项集一起使用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 $(日期 +%Y%m) | awk '{print $NF}')
要从 ls 中的不同目录执行,我们需要添加文件夹名称作为参数
gzip -5 $(ls -lrt -d -1 test/* | grep Type1 | grep -v $(date +%Y%m) | awk '{print $NF}')
收到的输出
类型1_20160102.xml.gz
类型1_20160105.xml.gz
类型1_20160624.xml.gz
类型1_20160703.xml.gz
类型1_20160704.xml.gz
类型1_20160705.xml.gz
此命令将压缩目录名称 Type1 中的所有文件,不包括当月文件