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
。