在尝试批量重命名一堆目录时,
rename 's/foo/barr/g' *
我不小心在其中输入了 mv 而不是 rename ( mv 's/foo/bar/g' *
),这似乎已经清除了目录。但是,ls *
显示了原来存在的所有文件。是什么赋予了?他们还在……某个地方吗?ls
单独或ls -a
不显示任何内容,但ls *
像以前一样显示完整的目录列表。只是读取指针吗?我能轻松康复吗?
答案1
在 中mv 's/foo/bar/g' *
,*
被 shell 扩展为当前工作目录中按词法排序的所有非隐藏文件或目录的名称。
那么mv
我们会用mv
, s/foo/bar/g
, afile
, bfile
, cfile
...打电话吗?
有不同的可能结果。
- 如果您使用的是类似 GNU 的系统,因为您还忘记了
--
标记选项的结尾,并且默认情况下,如果该列表中mv
有一个文件被调用,GNU 会在非选项参数之后接受选项。会将文件移动到父目录。-t..
mv
- 如果
*
扩展为仅一个文件,则变为mv s/foo/bar/g that-file
.如果that-file
是目录类型,它将把s/foo/bar/g
文件移动到该目录中。如果不是,它会将其重命名为该文件。由于我不希望s/foo/bar/g
存在(如果存在,也会that-file
给你一个错误),所以你会得到一个错误。 - if
*
扩展到多个文件,则除非最后一个 if 类型目录,你会得到一个错误。如果它是目录类型,则所有文件都将移动到该目录中。
显示您的文件的事实ls *
表明您处于上述后一种情况。也就是说,所有文件都已移至一个目录中,ls
将显示that-directory
,现在仅在您将所有其他文件移至该目录后才*
展开,并变为要求列出该目录的内容。that-directory
ls *
ls that-directory
ls
that-directory
that-directory
如果其中的某些文件已被移动的文件覆盖,例如同时存在 afoo
和that-directory/foo
之前的文件,则您可能会在此过程中丢失一些文件。
如果没有,您可以通过将文件移回that-drectory
当前工作目录来恢复文件。
例如,如果您在不到 10 分钟前运行过该命令,则zsh
可以执行以下操作:
mv that-directory/*(cm-10) .
将 ctime 小于 10 分钟的文件移回当前工作目录。