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.
小智 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 命令的复杂解决方案。
rsync -a --remove-source-files . ..
Run Code Online (Sandbox Code Playgroud)
rsync 是一个极其强大的文件复制工具,通常用于执行高效的增量远程备份和镜像。
使用上面的命令,我们告诉rsync将内容复制.到..
该开关-a启用递归到.子目录并启用一些其他常见选项。
该开关--remove-source-files告诉 rsync 在成功复制后删除源文件,即它使 rsync 的行为类似于mv命令。
| 归档时间: |
|
| 查看次数: |
199920 次 |
| 最近记录: |