在shell脚本中,我想删除当前目录中的所有文件和目录,但只删除一个文件。 我用了
ls | grep -v 'nameoffiletokeep' | xargs rm
删除文件,但不删除目录。
答案 0 :(得分:2)
find . -mindepth 1 -maxdepth 1 ! -iname nameoffiletokeep -print0| xargs -0 rm -rf;
这将查找当前工作目录的直接子目录中不名为nameoffiletokeep
的所有文件和目录,并将它们全部删除(递归目录),而不管前导点(例如.hidden
,如果您在文件名中使用了rm -rf *
),空格或其他元字符,则会遗漏这些内容。
我已使用-iname
对nameoffiletokeep
进行不区分大小写的匹配,但如果您想要区分大小写,则应使用-name
。选择应取决于基础文件系统行为,以及您对要保护的文件名的字母大小写的认识。
答案 1 :(得分:1)
如果您使用的是bash,则可以使用扩展的globbing:
shopt -s extglob
rm -fr !(nameoffiletokeep)
在zsh中,同样的想法是可能的:
setopt extended_glob
rm -fr ^nameoffiletokeep