Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除了一些文件外,这个bash如何删除所有文件?_Bash - Fatal编程技术网

除了一些文件外,这个bash如何删除所有文件?

除了一些文件外,这个bash如何删除所有文件?,bash,Bash,我在上找到了以下脚本(示例不再联机): 它删除所有文件和目录,但不包括命令行中指定的文件和目录 请你解释一下: 第一条线上发生了什么$@表示所有参数,但为什么要将其放在括号内 我读过IFS,但从未实际使用过,它在这里有什么用途 使用*[!“${x[*]}”]可以实现什么?我不明白如何把它分解成我知道的东西 #创建一个数组x,其中包含函数的参数 localx=(“$@”) #取消设置IFS变量。这使得双引号数组扩展为不带分隔符的单字 IFS= #删除与模式匹配的文件,即不以数组x中的字符结尾 r

我在上找到了以下脚本(示例不再联机):

它删除所有文件和目录,但不包括命令行中指定的文件和目录

请你解释一下:

  • 第一条线上发生了什么
    $@
    表示所有参数,但为什么要将其放在括号内
  • 我读过
    IFS
    ,但从未实际使用过,它在这里有什么用途
  • 使用
    *[!“${x[*]}”]
    可以实现什么?我不明白如何把它分解成我知道的东西
#创建一个数组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 *[!"$*"] 
}