使用mv代替rename;文件消失了

使用mv代替rename;文件消失了

在尝试批量重命名一堆目录时, 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-directoryls *ls that-directorylsthat-directory

that-directory如果其中的某些文件已被移动的文件覆盖,例如同时存在 afoothat-directory/foo之前的文件,则您可能会在此过程中丢失一些文件。

如果没有,您可以通过将文件移回that-drectory当前工作目录来恢复文件。

例如,如果您在不到 10 分钟前运行过该命令,则zsh可以执行以下操作:

mv that-directory/*(cm-10) .

将 ctime 小于 10 分钟的文件移回当前工作目录。

相关内容