Linux系统中如需删除目录中指定类型文件之外的全部文件,以此清理目录有哪些便捷的方法呢?下文即将为大家分享。
Linux中shell模式是一个由以下特殊字符组成的字符串,这些字符也称通配符或元字符:
*– 匹配零个或多个字符
?– 匹配任意单个字符
[seq]– 匹配 seq 中的任何字符
[!seq]– 匹配不在序列中的任何字符
通过扩展模式匹配运算符删除文件,下面是不同的扩展模式匹配运算符,其中模式列表是包含一个或多个文件名的列表,使用字符分隔|:
*(pattern-list)– 匹配零次或多次指定模式
?(pattern-list)– 匹配零次或一次指定的模式
+(模式列表) – 匹配指定模式的一个或多个实例
@(pattern-list)– 与指定模式之一匹配
!(pattern-list)– 匹配除给定模式之外的任何内容
先启用extglob shell 选项:
# shopt -s extglob
如需要删除除了filename之外的全部文件:
$ rm -v !("filename")
删除filename1和filename2之外的全部文件:
$ rm -v !("filename1"|"filename2")
下面的例子展示了如何以交互方式删除除所有.zip文件以外的所有文件:
$ rm -i !(*.zip)
可以删除.zip和.odt文件之外的全部文件:
$ rm -v !(*.zip|*.odt)
完成后可以关闭extglob shell 选项,如下所示:
$ shopt -u extglob
使用Linux find命令删除文件,或者与xargs命令结合使用管道:
$ find /directory/ -type f -not -name 'PATTERN' -delete
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm {}
$ find /directory/ -type f -not -name 'PATTERN' -print0 | xargs -0 -I {} rm [options] {}
删除以.gz之外的全部文件:
$ find . -type f -not -name '*.gz'-delete
使用管道和xargs,你可以修改上面的情况如下:
$ find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}
下面的命令将清除当前目录中除.gz、.odt和文件之外的所有文件:.jpg:
$ find . -type f -not \(-name '*gz' -或 -name '*odt' -或 -name '*.jpg' \) -delete
但是最后一种方法只适用于 bash。使用 Bash GLOBIGNORE 变量删除文件,GLOBIGNORE变量存储了由冒号分隔的模式列表(文件名),将被路径名扩展忽略。使用此方法,请进入您想要清理的目录,然后按如下方式设置GLOBIGNORE变量:
$ cd test
$ GLOBIGNORE=*.odt:*.iso:*.txt
在这种情况下,除 、 和 之外的所有文件都.odt将从.iso当前.txt目录中删除。
现在运行命令来清理目录:
$ rm -v *
之后,关闭GLOBIGNORE变量:
$ unset GLOBIGNORE
删除文件是一项需要极度谨慎的操作。在执行删除之前,务必清晰理解删除文件的动机——是为了移除某些特定类型的过时文件,还是仅仅为了释放磁盘空间。本文旨在提供一种方法,帮助您在需要清空目录中的所有文件时,能够保留那些以特定扩展名结尾的重要文件。