微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mv * 是对包含 2 个或更多文件的目录的破坏性命令吗?还有哪些其他 linux 命令具有类似的行为?

如何解决mv * 是对包含 2 个或更多文件的目录的破坏性命令吗?还有哪些其他 linux 命令具有类似的行为?

当我在包含 10 个文件的目录上运行没有目标目录的 mv * 时,出现如下错误

root@tryit-apparent:~/test2# ls                                                                                                                        
file1.txt  file10.txt  file2.txt  file3.txt  file4.txt  file5.txt  file6.txt  file7.txt  file8.txt  file9.txt                                          
root@tryit-apparent:~/test2# mv *                                                                                                                      
mv: target 'file9.txt' is not a directory       

当我在一个包含两个文件的目录上运行它时,它会用一个文件覆盖该文件

root@tryit-apparent:~/test# ls                                                                                                                         
tempfile  tempfile2                                                                                                                                    
root@tryit-apparent:~/test# mv *                                                                                                                       
root@tryit-apparent:~/test# ls                                                                                                                         
tempfile2                                

我阅读了手册页,但无法理解这种行为。想知道是什么导致了这种行为以及幕后发生了什么?

还有哪些其他 linux 命令有这样的缺陷和破坏性的操作,如果用户不知道这种行为,这些命令会静执行?

解决方法

在 Unix 中,与其他一些操作系统不同,* 之类的通配符由 shell 扩展,传递给正在运行的命令之前。因此,当您使用 mv *tempfile 作为当前目录中唯一的文件运行 tempfile2 时,shell 实际执行的是 mv tempfile tempfile2,它通常会重命名第一个文件在第二个之上,擦除 tempfile2 的先前内容。 shell 不知道也不关心这个命令是否特别对待它的最后一个参数,并且 mv 无法知道它的两个参数来自通配符扩展。因此,您看到的行为。

即使有两个以上的文件,您也可能遇到类似的问题。例如,如果您有名为 tempfile1tempfile9 的文件和名为 zyzzx 的子目录,那么 mv * 会将您的所有临时文件移动到 zyzzx 子目录中。

大多数情况下,您只需要注意通配符就是这样工作的,并谨慎对待将其参数之一特殊对待(例如作为目的地)的命令。出于同样的原因,cp 是另一个需要注意的问题。对于交互式使用,您可能希望习惯于使用 -imvcp 选项,它在覆盖文件之前要求确认;或使用别名将其设为默认值。

,

Move 旨在移动或重命名文件或目录,因此您需要一个source 目标。

如果文件的路径没有改变,那么就变成了重命名操作。

如果路径改变而名称保持不变,那就是移动。

您可以通过更改路径和名称来实现。

手册页可能很难让您全神贯注。

谷歌搜索有帮助:https://www.howtoforge.com/linux-mv-command/

在我看来,您可以先执行 cp 操作,然后执行 rm 来获得类似的结果,但这是两个步骤,而不是一个步骤。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。