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

Terminal 删除除一个文件tcsh以外的所有内容,terminal,tcsh,Terminal,Tcsh,我基本上希望在tcsh中执行以下bash命令: rm !(file1) 谢谢您可以使用ls-1(这是数字,不是小写字母L)列出每行一个文件,然后使用grep-vx排除(-v)与完全匹配的(-x)行,然后xargs将其发送到您的命令rm。比如说, ls -1 | grep -vx file1 | xargs rm 如果您的grep版本不支持-x选项,您可以使用锚定: ls -1 | grep -vx '^file1$' | xargs rm 若要将此选项用于除rm以外的可能不接受任意数量参

我基本上希望在tcsh中执行以下bash命令:

rm !(file1)

谢谢您可以使用
ls-1
(这是数字,不是小写字母L)列出每行一个文件,然后使用
grep-vx
排除(
-v
)与
完全匹配的(
-x
)行,然后
xargs
将其发送到您的命令
rm
。比如说,

ls -1 | grep -vx file1 | xargs rm
如果您的
grep
版本不支持
-x
选项,您可以使用锚定:

ls -1 | grep -vx '^file1$' | xargs rm

若要将此选项用于除
rm
以外的可能不接受任意数量参数的命令,请记住将
-n1
选项添加到
xargs
,以便逐个处理参数:

ls -1 | grep -vx '^file1$' | xargs -n 1 rm


我相信您也可以使用
find
-name
选项通过求反指定参数来实现这一点,即
find
实用程序本身可能支持
之类的表达式!(文件1)
,尽管您仍然需要将结果通过管道传输到
xargs

tcsh有一种特殊的
^
全局模式语法(在csh、sh或bash中不受支持)。在glob模式前面加上
^
将使其无效,从而导致匹配所有与该模式不匹配的文件名

引用tcsh手册:

整个全局模式也可以用“^”来否定:

       > echo *
       bang crash crunch ouch
       > echo ^cr*
       bang ouch
单个文件名不是全局模式,因此
^
前缀不适用于它,但可以通过(例如)在第一个字符周围使用方括号将其转换为一个文件名

因此:

rm ^[f]ile1
应删除当前目录中除
file1
以外的所有文件

我强烈建议在使用它之前进行测试,或者先使用
echo
命令:

echo ^[f]ile1
或者在按Enter键之前,使用Ctrl-X*将模式扩展到文件列表

更新:我了解到bash支持类似的功能,但语法不同。在bash中,
!(模式)
匹配模式不匹配的任何内容。除非启用了
extglob
shell选项,否则无法识别。与tcsh的
^
语法不同,模式可以是单个文件名。这与您的要求无关,但如果您决定切换到bash,它可能会很有用


zsh可能也有类似的功能。

这在bash中真的有效吗?我刚刚得到“
-bash:!:未找到事件”
”。