删除 Linux 中除特定扩展名之外的特定扩展名的文件

删除 Linux 中除特定扩展名之外的特定扩展名的文件

我有文件:

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$')

相关内容