如果我将当前/工作目录(使用导航到它cd
)设置为某个特定目录,然后键入:
rm *.xvg
这个命令会做什么?上面的命令是否真的会仅有的删除扩展名的文件.xvg
仅有的在工作目录中?
在询问之前我对尝试这个感到紧张,因为我想绝对确定上面的命令只会删除.xvg
文件位于工作目录中。
答案1
是的,rm *.xvg
会仅有的删除目录下指定扩展名的文件当前的目录。
A好的确保您确实位于要删除文件的目录中的方法是使用pwd
将显示当前目录的命令,然后执行操作ls
来验证您是否找到了所需的文件。
如果您对发出该命令有点担心rm
,您可以执行以下两件事:
键入
ls *.xvg
以查看受此命令影响的文件的列表。除非你有一个很多文件的数量,您也可以始终使用
-i
命令行开关 forrm
(也存在于cp
和mv
)。使用时rm -i *.xvg
会提示您输入每个单独的文件(如果可以删除它),因此您可以确保没有任何意外的内容被删除。 (如果你有很多文件,这会很乏味:)
答案2
您不需要导航到目录,只需使用
rm /some/dir/*.xvg
如果路径中有拼写错误或类似错误,其中 /som/dir 不存在:
cd /som/dir
rm *.xvg
会意外删除当前目录中的所有 .xvg 文件。第一个命令不会,并且您不需要再次 cd 返回。
另一种方法是使用 find:
find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete
答案3
是的,rm *.xvg
只会删除.xvg
当前目录中以 结尾的文件。原因如下。
当您键入这样的命令时,工作将在您使用的 shell(假设是 bash)和命令二进制文件之间分配。
您可以通过键入 来找到二进制文件which rm
。这个小程序负责取消链接文件。像这样的程序可以从命令行启动,并且可以prog arg1 arg2 arg3
在启动时读取参数列表。在 的情况下rm
,它们被解释为要删除的完全限定文件名的列表。因此,如果您位于包含该文件的目录中foo.bar
,则键入的delete 'foo.*'
结果将是rm: foo.*: No such file or directory
.请注意文件模式周围的单引号,它们告诉 shell 将参数按原样传递给 shell。
但是,如果您rm *.bar
在同一目录中键入,则会删除该文件。这里发生的情况是,您的 shell(您用来输入命令的程序)在将参数传递给命令之前正在执行一些转换。其中之一称为“文件名扩展”,也称为“通配符”。您可以看到 bash 文件名扩展列表这里。最常见的扩展之一是*
,它扩展为当前目录中的文件名。
查看工作中的 glob 的一个简单方法是使用echo
,它会打印回通过 shell 传递给它的所有参数。因此echo *
在同一目录中输入将输出foo.bar
.因此,当您键入 时rm *.bar
,实际发生的情况是 shell 将参数列表扩展为foo.bar
,然后将其传递给rm
命令。
有一些控制通配符的方法。例如,在最新版本的 bash 中,您可以打开一个名为 globstar 的选项,该选项将进行递归扩展。键入echo **/*.bar
将显示以所有子文件夹结尾的所有文件的列表.bar
。因此,输入rm **/*.bar
启用 globstar 的 bash 确实会递归删除子文件夹中的所有匹配文件。
答案4
命令 :
rm ./*.pgm
为我工作
命令:
rm *.pgm
给出错误命令(波兰语,翻译):
rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.
在
bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)