在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
。