删除除一个文件tcsh之外的所有内容

时间:2013-06-18 10:33:53

标签: terminal tcsh

我基本上想要执行以下bash命令但是在tcsh中:

rm !(file1)

由于

2 个答案:

答案 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可能有类似的东西。