通配符匹配 mypackage*.tar.xz 但不匹配 mypackage*fast.tar.xz?

通配符匹配 mypackage*.tar.xz 但不匹配 mypackage*fast.tar.xz?

在构建我的项目之前,我希望删除目录中任何现有的二进制文件。现在该目录包含两个文件mypackage-<version>-fast.tar.xzmypackage-<version>.tar.xz。我只想删除mypackage-<version>.tar.xz而不是*fast.tar.xz文件。

运行rm mypackage-*.tar.xz会删除这两个文件,而会find . -type f ! -name *fast.tar.xz列出目录中我不想删除的其他源文件。

答案1

如果你的包的版本总是以数字结尾,你可以使用

rm mypackage-*[0-9].tar.xz

...或者您可以使用某种类似的方式来匹配版本号的末尾,排除-fast包变体的匹配(甚至可能只是mypackage-*[!t].tar.xz)。

如果这不可能,那么...

假设您使用的是 shell,例如bash,它允许使用扩展ksh样式的通配模式(通过shopt -s extglobin启用bash),您可以这样做

rm mypackage-!(*-fast).tar.xz

上面的文件名通配模式部分!(*-fast)将匹配除匹配 的字符串之外的任何字符串*-fast

zsh如果KSH_GLOB设置了 shell 选项 ( setopt KSH_GLOB),则这也适用于shell。zsh启用扩展通配符 ( )后setopt EXTENDED_GLOB,您可以使用

rm mypackage-^(*-fast).tar.xz

要另外仅删除常规文件,请将 glob 限定符添加(.)到该文件名通配模式的最末尾。

sh外壳中,您可以使用

for name in mypackage-*.tar.xz; do
    case $name in (mypackage-*-fast.tar.xz) ;; (*) rm "$name"; esac
done

或者,

for name in mypackage-*.tar.xz; do
    case $name in (mypackage-*-fast.tar.xz) continue; esac
    rm "$name"
done

这会迭代所有匹配的名称mypackage-*.tar.xz,跳过另外匹配的名称mypackage-*-fast.tar.xz,并删除其余的名称。

答案2

可以使用find命令,但需要多指定查询:

find . -type f -name 'mypackage-*.tar.xz' ! -name 'mypackage-*fast.tar.xz'

然后您可以使用-delete许多版本的 find 中的操作来删除找到的文件:

find . -type f -name 'mypackage-*.tar.xz' ! -name 'mypackage-*fast.tar.xz' -delete

相关内容