在构建我的项目之前,我希望删除目录中任何现有的二进制文件。现在该目录包含两个文件mypackage-<version>-fast.tar.xz
和mypackage-<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 extglob
in启用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