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