如何在“mv * .*”之后取回文件?

cod*_*rti 14 filesystem command-line mv

我使用以下命令隐藏了一些文件:

mv * .*
Run Code Online (Sandbox Code Playgroud)

但现在我无法找到它们。我尝试使用:

mv .* *
Run Code Online (Sandbox Code Playgroud)

但什么也没发生(显示错误)。如果我运行:

ls -la
Run Code Online (Sandbox Code Playgroud)

它显示:

total 8  
drwxrwxr-x 2 abhishek abhishek 4096 Mar  9 20:46 .  
drwxrwxr-x 4 abhishek abhishek 4096 Mar  9 20:46 ..  
Run Code Online (Sandbox Code Playgroud)

有什么办法可以恢复我的隐藏文件吗?

pLu*_*umo 45

您的文件并未隐藏,您已将所有文件(和目录,如果有)向上移动一个目录。

发生这种情况是因为mv * .*不会像您想象的那样工作。该命令mv只会将一个文件移动到一个文件(重命名)或将一个或多个文件移动到一个目录。它不会通过一些智能重命名将多个文件移动到多个文件。


发生了什么?

假设我们的目录中有一个目录和 3 个文件:

dir1
file1
file2
file3
Run Code Online (Sandbox Code Playgroud)

某些 Shell(例如bash, dash, ...)会将您的命令扩展为:

mv dir1 file1 file2 file3 . ..
Run Code Online (Sandbox Code Playgroud)

您的扩展命令适合您在man mv以下位置找到的 SYNOPSIS 的第二种形式:

mv [OPTION]... SOURCE... DIRECTORY

注意...

  • . 是当前目录,
  • .. 是一个目录。

命令的意思是: move dir1, file1, file2and file3and .to ..; 它本质上也会给出一个错误,例如:

mv: cannot move '.' to '../.'
Run Code Online (Sandbox Code Playgroud)

但鉴于您对该目录具有写权限,所有其他文件都已被移动。您可以在..(= 上一级目录)中找到您的文件。但是,同名文件已被覆盖,您将不知道之前哪些文件位于哪个目录中。


如果您有一个子目录.hidden-dir,它将扩展为:

mv dir1 file1 file2 file3 . .. .hidden-dir
Run Code Online (Sandbox Code Playgroud)

然后,所有文件都将被移动到.hidden-dir. 但是,这对您来说似乎并非如此,因为您会.hidden-dirls -la输出中看到。


怎么修

跑:

dir1
file1
file2
file3
Run Code Online (Sandbox Code Playgroud)

但是,您需要知道这些名称。


你应该用过的

mv dir1 file1 file2 file3 . ..
Run Code Online (Sandbox Code Playgroud)

或者

mv: cannot move '.' to '../.'
Run Code Online (Sandbox Code Playgroud)

  • 它*可能*向上移动了一个目录。它将移动到最后出现在`.*` 扩展中的任何目录,这可能是一些隐藏目录,特别是如果这是在用户的主目录或受版本控制的目录中完成的。我建议运行`ls -1d | tail -n1` 在该目录中。(在这种情况下,他有一个空目录......但其他人可能没有那么幸运) (8认同)
  • *并且您将不知道之前哪些文件位于哪个目录中。* - 所有被移动的文件都将具有相同的 `ctime` - `ls -a -lcrt` 可用于按 ctime 对文件进行排序并使用最新的文件在底部。 (4认同)
  • 壳牌也很重要。例如,zsh 不匹配任何 glob 的文件 `..` 或 `.`。 (2认同)