命令“rm -rf !(a)”在 bash -c 语法中不起作用

Yay*_*uan 1 linux bash

family 目录中有三个文件,名为“a”“b”“c”。我使用“rm -rf !(a)”删除了“b”和“c”文件,在 bash CLI 中运行后,它工作正常。如下:

xx@xx:~/# ls
a b c
xx@xx:~/# rm -rf !(a)
xx@xx:~/# ls
a
Run Code Online (Sandbox Code Playgroud)

然而,当我通过“bash -c”运行它时,它向我抛出了一个语法错误,如下所示:[![在此处输入图像描述]

xx@xx:~/# ls
a b c
xx@xx:~/# bash -c "rm -rf !(a)"
bash: -c: line 0: syntax error near unexpected token`('
bash: -c: line 0:`rm -rf !(a)'
Run Code Online (Sandbox Code Playgroud)

然后我在“!”、“(”和“)”之前添加了反斜杠。虽然,并没有出现错误;我发现它不起作用。如下:

xx@xx:~/# ls
a b c
xx@xx:~/# bash -c "rm -rf \!\(a\)"
xx@xx:~/# ls
a b c
Run Code Online (Sandbox Code Playgroud)

任何机构都可以帮助澄清这个问题吗?

Pau*_*ges 5

不要extglob随意使用模式。
\n不要随意使用“非”逻辑。
\n不要使用glob

\n

看在上帝的份上,请不要将rm -frasroot任何东西一起使用该死的近乎偏执之外

\n

如果该目录或其任何子目录中还有其他内容 a,那么它就会消失。

\n
$: find\n.\n./a\n./abc\n./bar\n./bcd\n./efg\n./efg/hij\n./efg/hij/klm\n./foo\n./x\n./y\n./y/deleteme\n./y/deleteme/stuff\n\n$: bash -O extglob -c \'echo rm -fr !(x)\'\nrm -fr a abc bar bcd efg foo y\n
Run Code Online (Sandbox Code Playgroud)\n

显然,正如你所问的,它抓住了一切,而不是x
\n正如 Ted Lyngmo 在上面的评论中指出的那样,

\n
\n

rm -rf [^a]如果您想删除a. 如果您想明确删除band : ... 或crm -rf [bc]rm -rf b c...

\n
\n

当可以选择时,简单、清晰和具体实际上总是更好。

\n

特德添加:

\n
\n
\n

如果您想删除除当前目录之外的所有文件bc这是您在评论中要求的),您可以再次使用find扩展名-maxdepth 1以使其仅在当前目录中搜索:

\n
\n
$: find\n.\n./a\n./abc\n./bar\n./bcd\n./efg\n./efg/hij\n./efg/hij/klm\n./foo\n./x\n./y\n./y/deleteme\n./y/deleteme/stuff\n\n$: bash -O extglob -c \'echo rm -fr !(x)\'\nrm -fr a abc bar bcd efg foo y\n
Run Code Online (Sandbox Code Playgroud)\n
\n

如果您确定要删除列出的内容,请替换为echo中包含的版本rm -f有更多扩展,使得可以跳过提供顶级目录,并且它还有一个find.-delete删除文件:

\n
\n
find . -maxdepth 1 -type f \\! \\( -name b -o -name c \\) -exec echo {} +\n
Run Code Online (Sandbox Code Playgroud)\n
\n

(谢谢,特德 - 我只是回来添加这个,哈哈)

\n
\n

Paul Hodegs,你是对的,但是有一种情况,我需要在某个目录中保留一些指定的文件或子目录,我们需要定期删除该目录中的其他脏数据,以避免由于有限的磁盘无空闲情况而导致一些合作伙伴在使用后忘记删除该目录中的研究数据。\xe2\x80\x93\n段亚勇

\n
\n

有效,在这种情况下您原来的问题(某种程度上)编程问题。要非常小心,始终断言您正在正确的目录中工作,并且要小心,也许您经常备份数据以防止可能的错误,但在这种情况下,重要的是您明确列出了您想要的所有文件保留在单个命令中以删除其他所有内容。

\n

在我上面的例子中,如果你想保留abcbcd,你需要rm -fr $thatDir/!(abd|bcd).

\n

请务必小心,我强烈建议使用非特权用户。

\n

  • 根据经验,在实际使用诸如“rm”之类的破坏性应用程序之前,请始终使用“echo”或“ls”(等)测试您的glob(尤其是任何即使是最低限度复杂的东西)。 (2认同)