Linux 我想通过shell删除除少数as以外的所有文件,但会导致语法错误:";(“意外

Linux 我想通过shell删除除少数as以外的所有文件,但会导致语法错误:";(“意外,linux,bash,shell,ubuntu,Linux,Bash,Shell,Ubuntu,我想删除所有文件,除了update.sh和new\u update 我已经厌倦了shell脚本中的所有行,但返回了错误 意外标记( 当直接在终端上运行时,有时会执行,有时会产生与上述相同的错误,首先,您必须启用扩展全局搜索 rm -rf * ! ( "update.sh" | "new_update" ) #or rm -rf ! ( "update.sh" | "new_update" )

我想删除所有文件,除了
update.sh
new\u update

我已经厌倦了shell脚本中的所有行,但返回了错误

意外标记(


当直接在终端上运行时,有时会执行,有时会产生与上述相同的错误,首先,您必须启用扩展全局搜索

rm -rf  * ! ( "update.sh" | "new_update"  )    #or


rm -rf   ! ( "update.sh" | "new_update"  )     #or


rm -rf   ! ( update.sh | new_update  )         #or
那么通配符的各个部分之间就不能有空格

shopt -s extglob

您可以使用
grep-v
来反转匹配,
-w
用于整个单词,
-E
fir regex可以添加更多文件

rm -rf !(update.sh|new_update)
我不能保证它能处理包含空格和其他疯狂字符的文件名

需要gnu扩展的更安全选项是: (更多详情)

埃德:当评论员指责ls和xargs“危险”(为什么)时,我将其记录在案

printf '%s\0' * | grep -zEv '^(update.sh|new_update)$' | xargs -0 rm --

这不是你应该运行的命令,直到你100%完成了你想要它做的事情!@Chris_Rands你可以再详细说明一下吗如果你没有遇到shell语法错误,
rm-rf*
将在
rm
本身查看你尝试的异常之前删除当前目录中的所有内容如果您认为“嘿,也许
rm-rf*”(“update.sh”|“new_update”)“
会起作用”,那么您是对的:shell会将其视为一个完全有效的命令行,传递当前目录中的每个文件名,以及
(“update.sh”|“new_update”)
,作为
rm
的参数。它可以工作,但也会删除新的\u更新目录,我不想只更新。sh remains我刚刚测试过它,它应该可以工作。在使用
rm
之前,应该使用
echo
进行测试。确保
()
中没有空格。如果您编写了
!(update.sh | new\u update)
它将删除
新的\u更新
多亏了它的大量工作,
xargs
也有很大的缺陷(从设计的意义上讲是有缺陷的);如果不使用扩展名,例如
-0
-d
,它会将带有空格的文件名分解为多个参数,并去掉应该是文件名本身一部分的引号,等等。(作为一个有趣的例子,试着运行
touch$'file1\nfile 2'
——创建一个文件,其名称由字符串
file1
、换行符和
file2
组成;如果使用
xargs-d$'\n'
并以原始文本形式传递该名称,它将尝试删除
文件1和代码>文件2 < /代码>,但不删除任何文件的实际名称;如果不使用<代码> -d $ \ n′/代码>,行为会更糟。作为一种选择,考虑<代码>查找.-min深度1 -Max深度1 -名称UpDATE.S.Pune-o-名称NexUpUPDATE -PRUNE -O型F- Excel RM -{}+
;这样就可以避免使用
ls
xargs
所涉及的所有错误。(此代码与OP规范(包括已编辑规范)的另一个区别是,它删除名称中带有
new_update
的任何内容,即使该名称不是完整/全名;因此,这将保留
new_update.tmp
new_update.old
,即使
rm!(update.sh | new_update)
将删除其中任何一个名称)。
printf '%s\0' * | grep -zEv '^(update.sh|new_update)$' | xargs -0 rm --
ls * | grep -Ev "update.sh|new_update" | xargs rm