我有文件:
a.txt
b.txt
e.txt
c.c
d.o
我只想删除.txt
不包括 的文件e.txt
,因此最后保留的文件是:
e.txt
c.c
d.o
答案1
给定:
cpetro01@<work_laptop> ~/Notes/test
$ ls
a.jpg a.txt b.mov b.txt c.jpg c.mov
做:
$ find ./ -name "*.txt" -not -name "e.txt"
./a.txt
./b.txt
因此:
cpetro01@<work_laptop> ~/Notes/test
$ ls
a.jpg a.txt b.mov b.txt c.jpg c.mov e.txt
cpetro01@<work_laptop> ~/Notes/test
$ find ./ -name "*.txt" -not -name "e.txt" -exec rm {} \;
cpetro01@<work_laptop> ~/Notes/test
$ ls
a.jpg b.mov c.jpg c.mov e.txt
像那样?
答案2
两种方式:
使用
GLOBIGNORE
变量来指示通配时将被忽略的文件名:GLOBIGNORE=e.txt rm -- *.txt unset GLOBIGNORE
设置
extglob
选项,并使用扩展通配符来匹配.txt
除以下文件之外的所有文件e.txt
:shopt -s extglob rm -- !(e).txt shopt -u extglob
答案3
这将列出.txt
除以下之外的所有文件e.txt
:
ls -1 *.txt | grep -v '^e.txt$'
然后你可以做命令替换告诉rm
删除这些文件:
rm $(ls -1 *.txt | grep -v '^e.txt$')