在linux中,如何删除除模式*.txt之外的所有文件?

Fir*_*gun 112 shell bash wildcards

我知道如何删除txt当前目录下的所有文件rm *.txt。有谁知道如何删除当前目录中的所有文件,除了txt文件?

Kev*_*vin 159

您可以使用find

find . -type f ! -name '*.txt' -delete
Run Code Online (Sandbox Code Playgroud)

或者 bash 的扩展通配功能:

shopt -s extglob
rm *.!(txt)
Run Code Online (Sandbox Code Playgroud)

或者在 zsh 中:

setopt extendedglob
rm *~*.txt(.)
#  ||     ^^^ Only plain files
#  ||^^^^^ files ending in ".txt"
#  | \Except
#   \Everything
Run Code Online (Sandbox Code Playgroud)

  • `*.!(txt)` 不应该是 `!(*.txt)` 吗? (3认同)

小智 21

如果您只想删除除“*.txt”之外的所有文件,则可以使用以下命令:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

但如果你还想删除目录和文件,那么你可以使用这个:

$ find . ! -name "*.txt" -exec rm -r {} \;


Ken*_*ent 13

有很多方法可以做到。但最简单的方法是(bash):

shopt -s extglob
rm !(*.txt)
Run Code Online (Sandbox Code Playgroud)


小智 8

您可以使用倒置的 grep 和 xargs

ls | grep -v .txt$| xargs rm
Run Code Online (Sandbox Code Playgroud)


mic*_*has 5

一种没有的解决方案find

mv dir/*.txt otherdir/
rm -r dir
mv otherdir dir
Run Code Online (Sandbox Code Playgroud)

这应该适用于所有类型的外壳。