Terminal 删除除一个文件tcsh以外的所有内容
我基本上希望在tcsh中执行以下bash命令: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以外的可能不接受任意数量参
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:!:未找到事件”
”。