从全局匹配中排除一种模式

从全局匹配中排除一种模式

我有几个具有相同基本文件名的文件。我想删除除一个以外的所有内容

foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc

如果我不需要保留一个,我知道我可以使用rm foo.*.

TLDP演示^否定匹配。通过反复试验,我发现

rm foo.*[^org]

做了我需要的事情,但我不太明白语法。

另外,虽然这不是我的用例的限制,但我认为这种模式也忽略了foo.ofoo.or。这种模式是如何工作的,以及忽略的 glob 会发生什么仅有的 foo.org看起来像?

答案1

shopt -s extglob
echo rm foo.!(org)

这匹配后面foo.跟有任何 NOT 的内容org

要随后恢复正常的 glob 行为,请使用:

shopt -u extglob

参考:GNU Bash 参考手册

答案2

在 bash 中,您还可以使用GLOBIGNORE="*.org"; rm -i foo*.

unset GLOBIGNORE完成后。

它并不比 更好shopt -s extglob,但我发现它更容易记住。

答案3

一根管子能做什么?

ls * | grep -v "foo.org" | xargs -I {} echo {}

(显然,您可能想在最后一个链中将 echo 替换为 rm )。

答案4

另一种方式来完成。假设您有一些文件foo.sh想要从操作中排除,但又想添加csv到所有其他文件中。您可以使用以下循环:

for f in *; do
  if [ "${f: -3}" != ".sh" ]; then
    mv "$f" "${f%}.csv"
  fi
done

相关内容