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

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

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

我尝试了类似的方法mv *.*,但是没有效果。

答案1

您正在寻找的命令是

mv * .[^.]* ..

或(更多信息见下文):

(shopt -s dotglob; mv -- * ..)

解释:mv命令移动文件和目录。 的最后一个参数mv是目标(在本例中是树中“上”一级的目录,..)。 之前的参数是源文件和目录。 星号 ( *) 是通配符,它​​匹配所有不以点开头的文件。 以点开头的文件(点文件)是“隐藏”的。 它们使用模式进行匹配.[^.]*(请参阅下面的编辑)。

请参阅我链接的手册页以获取更多信息mv


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

作为克里斯·约翰森正确指出:该模式.*还匹配...。由于您不想(也不能)移动它们,因此最好使用匹配以点开头的任何文件名的模式除了那两个。该模式的.[^.]*作用就是:它匹配任何以点 (2) 开头的文件名 (1),后面跟着一个字符不是一个点 (3) 后跟零个或多个任意字符。

作为帕加斯 指出,我们还必须添加模式.??*才能匹配以两个点开头的文件。请参阅他的回答,了解使用find

Arjan 的回答提及shopt以避免所有与点文件相关的问题。但是,以破折号开头的文件仍然存在问题。而且它需要三个命令。不过,我喜欢这个想法。我建议像这样使用它:

(shopt -s dotglob; mv -- * ..)

这将shopt在子 shell 中执行(因此不需要第二次调用shopt)并使用--,以便以破折号开头的文件不会被解释为的参数mv

答案2

简短回答:使用

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

长答案:

命令

mv * .* ..

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

mv * .[^.]* ..

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

mv * .[^.] .??* ..

它将匹配除了.和 之外的所有内容..*将匹配不以 开头的所有内容..[^.]将匹配所有以点开头的 2 个字符的文件名(除了 )...??*并将匹配所有以点开头且至少有 3 个字符的文件名。

更好的是,你可以使用

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

这避免了丑陋的全局黑客攻击mv * .[^.] .??* ..

答案3

为了完整起见,也可以告诉 Bash shell 包含隐藏文件,使用shopt

shopt -s dotglob
mv -- * ..
shopt -u dotglob

答案4

rsync -a --remove-source-files . ..

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

使用上述命令,我们将rsync内容复制...

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

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

相关内容