如何将所有文件从当前目录移动到上层目录?

137 linux mv

linux下如何将当前目录下的所有文件移动到上层目录?

我试过类似的东西mv *.*,但它不起作用。

Ste*_*202 211

您正在寻找的命令是

mv * .[^.]* ..
Run Code Online (Sandbox Code Playgroud)

或(更多信息见下文):

(shopt -s dotglob; mv -- * ..)
Run Code Online (Sandbox Code Playgroud)

说明:该mv命令移动文件和目录。的最后一个参数mv是目标(在这种情况下是目录树中“向上”一步的目录..)。之前的参数是源文件和目录。星号 ( *) 是一个通配符,它​​匹配所有不以点开头的文件。以点开头的文件(点文件)是“隐藏的”。它们使用模式匹配.[^.]*(见下面的编辑)。

请参阅我链接的联机帮助页以获取有关mv.


为什么.[^.]*而不是.*

正如Chris Johnsen正确指出的那样:该模式.*也匹配...。由于您不想(也不能)移动它们,因此最好使用匹配任何以点开头的文件名的模式,除了这两个. 该模式.[^.]*就是这样做的:它匹配任何以点 (2) 开头的文件名 (1),后跟一个不是点 (3) 后跟零个或多个任意字符的字符。

正如Paggas 指出的那样,我们还必须添加模式.??*以匹配以两个点开头的文件。使用find.

Arjan 的回答提到shopt是为了避免 dotfiles 的所有这些问题。但是,以破折号开头的文件仍然存在问题。它需要三个命令。不过,我喜欢这个主意。我建议像这样使用它:

(shopt -s dotglob; mv -- * ..)
Run Code Online (Sandbox Code Playgroud)

shopt在子shell中执行(因此没有第二次调用shoptrequired )并使用,--以便以破折号开头的文件不会被解释为mv.

  • 使用 `.*` 可能会导致 *mv* 产生关于无法移动 `.` 和 `..` 的警告/错误。你可以试试 `mv * .[^.]* ..`。 (7认同)
  • * .* 语法没有任何危害——包括 .. 只有在与 chmod 和 chown 以及“recurse”标志(即 chmod -R 或 chown -R)一起使用时才有危险。在这些情况下,永远不要*永远*输入 chown .* 或 chmod .* -- chown 您正在查找的路径中的顶级目录并使用 -h (不要遵循符号链接)。但是, mv .. 根本不做任何事情,所以不用担心。 (2认同)

小智 48

简短回答:使用

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Run Code Online (Sandbox Code Playgroud)

长答案:

命令

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

将不起作用,因为.*可以匹配...。但是命令

mv * .[^.]* ..
Run Code Online (Sandbox Code Playgroud)

也不会工作,因为.[^.]*不匹配,例如,..filename!相反,我所做的是

mv * .[^.] .??* ..
Run Code Online (Sandbox Code Playgroud)

这将匹配除.and之外的所有内容..*将匹配所有不以 a 开头的内容..[^.]将匹配所有以点开头的 2 个字符文件名,除了...??*并将匹配所有以点开头且至少包含 3 个字符的文件名。

更好的是,您可以使用

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Run Code Online (Sandbox Code Playgroud)

这避免了丑陋的 glob hacks mv * .[^.] .??* ..


Arj*_*jan 14

为了完整起见,您还可以使用以下命令告诉 Bash shell 包含隐藏文件shopt

shopt -s dotglob
mv -- * ..
shopt -u dotglob
Run Code Online (Sandbox Code Playgroud)


小智 9

mv 在使用时缺少移动隐藏文件的功能*- 那么为什么不使用 copy 呢?

cp -rf . ..

rm -rf *
Run Code Online (Sandbox Code Playgroud)

无需进入 dotglobbing 和使用 find 命令的复杂解决方案。


mru*_*cci 7

rsync -a --remove-source-files . ..
Run Code Online (Sandbox Code Playgroud)

rsync 是一个极其强大的文件复制工具,通常用于执行高效的增量远程备份和镜像。

使用上面的命令,我们告诉rsync将内容复制...

该开关-a启用递归到.子目录并启用一些其他常见选项。

该开关--remove-source-files告诉 rsync 在成功复制后删除源文件,即它使 rsync 的行为类似于mv命令。