我只能在使用globbing时使rm交互吗?(使用bash或zsh或同时使用)


15

每当我rm用外壳球一次添加多个项目时,即使模式扩展到超出我预期的可能性甚至是很小的可能性,我也总是会记得添加-i,但是(当然)我会忘记并且不小心吹走了一些有用的东西。有些人尝试使用别名来解决此问题,例如,alias rm='rm -i'但我讨厌让rm 始终保持交互式的想法,因为那样我就会养成一直使用的习惯-f,这显然会破坏整个目标。

我想做的是rm-i在使用globbing时使用,并且-f当然要覆盖它-i,因此我仍然可以像平常一样删除整个目录rm -rf junk

因此rm *blah*,确实会,rm -i *blah*但是rm blah会完全按照键入的方式工作。

如果在不同的shell中完成此操作的方式有所不同,我将选择一个答案,该答案为bash zsh 提供方法,不是仅涵盖一个或另一个的答案。


注意:我实际上并不认为这一定是个好主意;我只是问是否有可能。如果您认为这是一个愚蠢的主意,我很高兴听到您的意见背后的原因,但请不要在答案栏中发布此类评论。真正的答案要么告诉我如何执行此操作,要么解释为什么/不可能(或者可能提供一种替代方法来获得类似结果)。但是,如果您想告诉我为什么这很愚蠢,请发表评论。即使我不同意结论,我也会发表理性的评论。


7
一些建议:使用GNU实用程序,rm -I就像-i只有在超过三个文件或-r传递时才触发。在中bash,使用Ctrl-x *键盘快捷键来扩展glob并自己检查。
2012年

2
对于bash,我相信答案是“否”。使用zsh,您可以通过将noglobrm别名为noglob my-rm,然后让my-rm作为检查glob,扩展它并传递-i或不传递-i的脚本来加以利用。不知道,不知道zsh。
derobert

@derobert:您肯定听起来很了解zsh。
iconoclast 2012年

@iconoclast不,不是zsh,只有Google。奇怪的是,我发现在尝试使用bash进行操作时发现了这一点。:-P
derobert

如果您想要看起来像rm但实际上工作不同的东西,我应该编写一个脚本(或别名/功能/功能键)myrm,让该脚本完成您喜欢的事情。
Walter A

Answers:


9

这并不容易。问题是您这样做时:

rm -- *.txt

rm只会看到文件列表,而不是已经由Shell扩展的glob模式。

您可以做的是(zsh):

alias rm='noglob rm'

这告诉zsh,调用rm时不应扩展模式。然后,您可以将rm重新定义为一个函数,该函数本身会进行扩展,并在需要时添加“ -i”,例如:

'rm'() {
  [[ "$*" = *[*[?]* ]] && set -- -i "$@"
  command rm $~@
}

这种方法的问题在于,这个新的“ rm”看不到两者之间的区别

rm *

rm '*'

要删除名为的文件*,您必须编写它:

rm [*]

-1

在bash中工作,可能在其他shell中工作。放在你的.bashrc

function rm() { 
  while test "${1:0:1}" = "-"; do 
    shift
  done
  if test $# -eq 1; then 
    command rm "$1"
  else 
    command rm -i "$@"
  fi
}

3
您可以使用command rm避免硬编码PATH。另外,检查参数计数的方法有点不可靠,rm可以选择一些方法。
2012年

1
应该用“ $ 1”引起来,否则如果传递的单个文件中包含空格,该操作将失败。@ jw013-您也可以转义该命令,例如\rm
jordanm 2012年

@jordanm对于需要$1用双引号引起来的引用是正确的,但是对于命令转义是错误的。引用仅抑制别名,抑制功能查找。这个答案暗示了一个功能,而不是一个别名。
2012年

1
至少旧的编辑功能正常-新的编辑丢弃用户命令行选项,这可能不是正确的选择。
2012年

@ jw013-我不知道这仅适用于别名查找,而不适用于函数。谢谢提供信息。
jordanm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.