我有几个具有相同基本文件名的文件。我想删除除一个以外的所有内容
foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
如果我不需要保留一个,我知道我可以使用rm foo.*
.
TLDP演示^
否定匹配。通过反复试验,我发现
rm foo.*[^org]
做了我需要的事情,但我不太明白语法。
另外,虽然这不是我的用例的限制,但我认为这种模式也忽略了foo.o
和foo.or
。这种模式是如何工作的,以及忽略的 glob 会发生什么仅有的 foo.org
看起来像?
答案1
shopt -s extglob
echo rm foo.!(org)
这匹配后面foo.
跟有任何 NOT 的内容org
要随后恢复正常的 glob 行为,请使用:
shopt -u extglob
答案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