我刚刚创建了一个名为 的脚本myscript
,并执行了 achmod +x myscript
这样它就会执行。我尝试执行myscript
并意识到我忘记了.sh
扩展名。
因此在我的 shell 中发出以下命令bash
:
mv myscript *.sh
...瞧,文件不再存在了。我按名称搜索了它并获得了过去一小时内修改的所有文件的列表,但我找不到该文件。它去哪儿了?是否还有其他损坏需要修复?
答案1
您可能至少有一个目录或恰好有一个与*.sh
当前目录中的模式匹配的文件。
如果它是一个目录,您会发现该目录中的文件
myscript
没有受到损害。例子mkdir dir.sh mv myscript *.sh
这里
mv
命令被 shell 扩展为 bemv myscript dir.sh
并且文件被移动到该目录中。如果是文件你会发现该文件已经被被取代和
myscript
。例子touch file.sh mv myscript *.sh
这里
mv
命令被 shell 扩展为 bemv myscript file.sh
,并且文件被重命名为file.sh
,覆盖它可能包含的任何先前内容。如果当前目录中有匹配的文件和目录,
*.sh
则取决于集合中的最后一项(根据您的区域设置按字母数字顺序排列)是文件还是目录。在所有情况下,shell 都会扩展通配符,例如mv myscript file1.sh file2.sh lastdir.sh
扩展为 或mv myscript dir.sh file.sh
。- 如果目录是最后一个项目,则 shell 匹配的所有项目都将移动到该目录中。
- 如果文件是最后一个项目,则该
mv
命令将失败并出现错误,因为无法将多个项目重命名为单个目标。 (看来你没有报告错误,mv
这种情况并没有出现。)
最后,如果当前目录中没有任何内容与该模式匹配
*.sh
,则 shell 可能会保留该模式并将其mv
作为文字传递。在这种情况下,该mv
命令会将文件重命名为文字字符串*.sh
,其中包含星号作为第一个字符。
我猜想,操作 #2 很可能会识别发生了什么,并且您将丢失与模式匹配的文件的原始内容*.sh
。