Linux 在 Bash 脚本中查找带有否定的文件

Linux 在 Bash 脚本中查找带有否定的文件

我的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 中的所有文件,不包括当月文件

相关内容