使用bash shell删除目录中的特定文件的3种方法
我是一名Linux新用户。现在我需要清理一个下载目录中的文件,其实我就是想从~/Download/文件夹删去除了以下格式的文件外所以其它文件:
1.*.iso-所有的iso格式的文件。
2.*.zip-所有zip格式的文件。
我如何在一个基于Linux,OSX或者Unix-like系统上的bashshell中删除特定的文件呢?
Bashshell支持丰富的文件模式匹配符例如:
1.*-匹配所有的文件。
2.?-匹配文件名中的单个字母。
3.[...]-匹配封闭括号中的任何一个字母。
策略#1:见识一下扩展的模式匹配符
这里你需要用系统内置的shopt命令来开启shell中的extglob选项,然后你就可以使用扩展的模式符了,这些模式匹配符如下:
1.?(模式列表)-匹配零次或一次给定的模式。
2.*(模式列表)-匹配零次或多次给定的模式。
3.+(模式列表)-至少匹配一次给定的模式。
4.@(模式列表)-匹配一次给定的模式。
5.!(模式列表)-不匹配给定模式。
一个模式列表就是一个或多个用|分开的模式(文件名)。
首先要打开extgolb选项:
shopt-sextglob
在Bash中删掉除.zip和.iso文件以外的所有文件
rm命令的语法格式为:
##仅保留file1文件## rm !(file1) ##仅保留file1和file2文件## rm !(file1|file2) ##仅保留zip文件## rm !(*.zip) ##仅保留zip和iso文件## rm !(*.zip|*.iso) ##你也可以使用完整的目录## rm/Users/vivek/!(*.zip|*.iso|*.mp3) ##也可以传递参数## rm[选项] !(*.zip|*.iso) rm-v !(*.zip|*.iso) rm-f !(*.zip|*.iso) rm-v-i !(*.php)
策略#2:使用bash的GLOBIGNORE变量删除指定文件以外的所有文件
摘自bash(1)手册页:
这是一个用冒号分开的模式列表,通过路径展开方式定义了要忽略的文件集合。如果一个匹配到路径展开模式的文件也匹配GLOBIGNORE中的模式,那么它会从匹配列表中移除。
要删除所有文件只保留zip和iso文件,应如下设置GLOBIGNORE:
##只在BASH中可行## cd~/Downloads/ GLOBIGNORE=*.zip:*.iso rm-v* unsetGLOBIGNORE
策略#3:用find命令删除所有其它文件仅保留zip和iso文件
如果你正在使用tcsh/csh/sh/ksh或者其它shell,你可以在Unix-like系统上试着用下面find命令的语法格式来删除文件:
find/dir/-typef-not-name'匹配模式'-delete
或者
##对于怪异的文件名可以使用xargs## find/dir/-typef-not-name'匹配模式'-print0|xargs-0-I{}rm{} find/dir/-typef-not-name'匹配模式'-print0|xargs-0-I{}rm[选项]{}
想要删除~/source目录下除php以外的文件,键入:
find~/sources/-typef-not-name'*.php'-delete
或者
find~/sources/-typef-not-name'*.php'-print0|xargs-0-I{}rm-v{}
只保留*.zip和*.iso文件的语法如下:
find.-typef-not\(-name'*zip'-or-name'*iso'\)-delete