除了一些文件外,这个bash如何删除所有文件?
我在上找到了以下脚本(示例不再联机): 它删除所有文件和目录,但不包括命令行中指定的文件和目录 请你解释一下:除了一些文件外,这个bash如何删除所有文件?,bash,Bash,我在上找到了以下脚本(示例不再联机): 它删除所有文件和目录,但不包括命令行中指定的文件和目录 请你解释一下: 第一条线上发生了什么$@表示所有参数,但为什么要将其放在括号内 我读过IFS,但从未实际使用过,它在这里有什么用途 使用*[!“${x[*]}”]可以实现什么?我不明白如何把它分解成我知道的东西 #创建一个数组x,其中包含函数的参数 localx=(“$@”) #取消设置IFS变量。这使得双引号数组扩展为不带分隔符的单字 IFS= #删除与模式匹配的文件,即不以数组x中的字符结尾 r
- 第一条线上发生了什么
表示所有参数,但为什么要将其放在括号内$@
- 我读过
,但从未实际使用过,它在这里有什么用途IFS
- 使用
可以实现什么?我不明白如何把它分解成我知道的东西*[!“${x[*]}”]
localx=(“$@”)
#取消设置IFS变量。这使得双引号数组扩展为不带分隔符的单字IFS=
#删除与模式匹配的文件,即不以数组x中的字符结尾rm-rf*[!“${x[*]}”]
local x=(“$@”)
创建一个数组,该数组是所有参数的副本($@
本身就是一个数组)
IFS=,
将内部字段分隔符设置为逗号
IFS=,rm-rf*[!“${x[*]}”]
表示删除所有不以作为参数传递的任何字符结尾的文件。由于*
被用作数组的索引,并且变量被引用,因此它被扩展为单个字符串,通常分隔数组元素的空格被IFS
的内容替换(在本例中为逗号)
解析为rm-rf*[!a,b,c]
,它也不会删除以逗号结尾的文件
我认为功能可以简化为:
rmbut() {
IFS= rm -rf *[!"$*"]
}
但它的行为会有微妙的不同。此版本将
IFS
设置为null,因此上面的示例将解析为rm-rf*[!abc]
,这将删除以逗号结尾的文件(必须将逗号作为参数显式传递以保留此类文件)。但是,可以通过设置IFS=,
(根本不需要复制数组)返回该行为。您确定这些是“local x..”行上的括号(),还是大括号{}或括号[]。这很重要。另外,从函数的外观来看,它只是删除了所有文件,除了任何具有函数参数指定的basename的文件。是的,括号是正确的。这就是函数的目的,很明显,我想知道为什么^^@eugene y:你写了IFS=
,但是原始的是IFS=,
你是否输入了错别字,或者逗号是用来将IFS
与行的其他内容分开的?@eugene y:你确定吗?我现在刚试过,从commandlinefu.com上复制粘贴,效果很好…@Alberto:touch abc bcd cde;rmbut bcd只删除了“cde”
@eugene y:有了这个输入,它就不起作用了,你是对的,无论有没有,IFS
之后的,谢谢你指出这一点。我认为这个行为是正确的。“删除文件,但删除以“b”或“c”或“d”结尾的文件。由于abc
以“c”结尾,因此不会删除该文件。感谢您的详细回答:)
rmbut a b c
rmbut() {
IFS= rm -rf *[!"$*"]
}