在 bash shell 中,当我必须删除同一目录中的多个文件时,我当前需要执行以下操作:
rm /some/path/file1 /some/path/file2
有没有更短的方法来编写这个,这样我就不必在/some/path/
不使用变量或更改工作目录的情况下重新输入?
也许类似于:
rm /some/path/(file1,file2)
答案1
你很接近:
rm /some/path/{file1,file2}
甚至
rm /some/path/file{1,2}
相关的并受其他 shell 支持的是这样的模式
rm /some/path/file[12]
前两个扩展为两个显式文件名参数;第三个是/some/path
匹配所有文件的模式。
答案2
或者,您可以利用 Bash 中的 Readline 库。这是一种解决方法,但相对容易输入。
ls /some/path/
rm
ESC.file1
ESC.file2
(假设您的元前缀是ESC关键。)
第一个命令中的extrals
将历史记录中的路径作为上一个命令的最后一个参数ESC.(或如手册所述M-.
或什至M-_
):
将最后一个参数插入到上一个命令中(上一个历史条目的最后一个单词)。
因此,您实际上是在文件名之前键入最后一个路径。 (请注意尾部斜杠在行中ls
)。
答案3
除了这些富有洞察力的答案之外,您还可以使用多种模式来匹配文件组。和文件名扩展和模式匹配,您可以告诉 bash 匹配目录中的所有文件、以某内容开头的所有文件、具有相同扩展名的所有文件等。
当然,如果你使用 rm,你必须非常小心,不要删除你不想要的东西。我建议首先使用 ls 来列出路径参数将显示的内容。
这里有几个例子。
假设您想要匹配目录中的所有文件,要查看
rm
命令将处理什么,请使用ls
.您可以使用星号 (*
) 全局运算符来匹配任意数量的字符。ls /some/path/*
或者也许所有以 test 开头的文件:
ls /some/path/test*`
所有以 test 开头、一个字符、以
.sh
.您可以使用问号 (?
) 字符来匹配一个字符。ls /some/path/test?.sh
假设您有 9 个文件
test1.sh
、test2.sh
等,最多test9.sh
,并且想要删除这些测试脚本。你也有一个testa.sh
你想保留的。您可以搜索以 test 开头、数字一到九或非字母类、以.sh
.它们使用方括号 ([]
) 来匹配字符组。ls /some/path/test[1-9].sh ls /some/path/test[!:alpha:].sh
诸如此类的匹配也可以相当简单地编写脚本,从而可以在脚本中对文件进行非常精细的调整或广泛的分组以实现自动化。
答案4
如果您使用 bash,则可以M-r
通过添加以下行来重复最后一个参数~/.inputrc
:
"\er": "!#:$\e^"
!#
是当前行,$
是最后一个参数,\e^
是history-expand-line
。