Answers:
您可以使用find:
find . -type f ! -name '*.txt' -delete
或bash的扩展globing功能:
shopt -s extglob
rm *.!(txt)
或在zsh中:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
*.!(txt)应该!(*.txt)吗?
rm如果有文件夹,它会阻塞。
find . -type f ! -name "*.txt" | xargs -r rm是否可以在GNU \ xargs中使用。BSD和UNIX xargs命令可能没有-r,您必须检查本地man xargs
如果只想删除“ * .txt”以外的所有文件,则可以使用以下命令:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
但是,如果您还想删除目录和文件,则可以使用以下命令:
$ find . ! -name "*.txt" -exec rm -r {} \;
您可以使用倒置的grep和xargs
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rm效果也一样
grep -v *.txt仅在只有一个.txt文件的情况下才起作用。如果没有,grep将*.txt用作模式;否则,将用作模式。如果有多个文件,它将在所有其他.txt文件中搜索第一个文件名,而忽略的输出ls。(确切的结果可能取决于外壳的glob选项。)
.txt$将匹配txt以点末结尾的字符串。因为grep以正则表达式为参数。因此,文件a.txt和aatxt并a-txt都将受到这个表达式匹配。正确的表达应为ls | grep -v \\.txt$ | xargs --no-run-if-empty rm。对于好奇的人:如果您想安全地使用该表达式ls | grep \\.txt$ | xargs --no-run-if-empty echo,请使用此测试表达式(请注意:没有-v标记和rm=>echo)。注意2:您可能已经注意到双反斜杠。一个用于正则表达式,另一个用于bash逃脱斜线。
ls在实际尝试调用之前一样,使用无害的命令测试给定的答案rm。