我基本上想要执行以下bash命令但是在tcsh中:
rm !(file1)
由于
答案 0 :(得分:1)
您可以使用ls -1
(这是第一个,而不是小写字母L)每行列出一个文件,然后使用grep -vx <pattern>
排除(-v
)行(-x
)匹配<pattern>
,然后将xargs
与您的命令rm
匹配。例如,
ls -1 | grep -vx file1 | xargs rm
如果您的grep
版本不支持-x
选项,则可以使用锚点:
ls -1 | grep -vx '^file1$' | xargs rm
要将此rm
以外的命令使用,可能不会使用任意数量的参数,请记住将-n 1
选项添加到xargs
,以便逐个处理参数:
ls -1 | grep -vx '^file1$' | xargs -n 1 rm
我相信您也可以使用find
的{{1}}选项通过否定指定参数来实现此目的,即 -name
实用程序本身可能支持表达式与find
类似,但您仍需要将结果传递给!(file1)
。
答案 1 :(得分:1)
tcsh为glob模式提供了一种特殊的^
语法(csh,sh或bash不支持)。使用^
对glob模式进行前缀否定它,导致匹配不匹配模式的所有文件名。
引用tcsh手册:
整个glob-pattern也可以用`^'来否定:
> echo * bang crash crunch ouch > echo ^cr* bang ouch
单个文件名不是glob模式,因此^
前缀不适用于它,但可以通过例如用方括号包围第一个字符将其转换为一个。 / p>
所以这个:
rm ^[f]ile1
应删除除file1
以外的当前目录中的所有文件。
我强烈建议您在使用它之前先测试一下,先使用echo
命令:
echo ^[f]ile1
或使用 Ctrl-X * 将模式扩展到文件列表,然后再按 Enter 。
更新:我已经了解到bash支持类似的功能,但语法不同。在bash中,!(PATTERN)
匹配模式匹配的任何 。除非启用extglob
shell选项,否则无法识别。与tcsh的^
语法不同,模式可以是单个文件名。这与您要求的内容无关,但如果您决定切换到bash,它可能会有用。
zsh可能有类似的东西。