mv * 文件夹(避免“无法移动”错误)

Ame*_*ina 10 zsh rename

每当我想将数千个文件移动到一个新文件夹时,我总是遇到同样的问题。

> mkdir my_folder
> mv * my_folder
mv: cannot move 'my_folder to a subdirectory of itself 'my_folder'
Run Code Online (Sandbox Code Playgroud)

虽然我认为上面的错误是无害的(是吗?)我想知道是否有办法避免它。

如果重要,我对 zsh 中的解决方案或在各种 shell 中运行良好的解决方案感兴趣。

Kev*_*vin 14

在 zsh 中,extended_glob启用该选项后,您可以使用~从 glob 中排除模式,因此您可以使用:

setopt extended_glob
mv -- *~my_folder my_folder
Run Code Online (Sandbox Code Playgroud)

或者使用否定运算符(仍然带有extended_glob):

mv -- ^my_folder my_folder
Run Code Online (Sandbox Code Playgroud)

使用大括号避免两次输入目录名称:

mv -- {^,}my_folder
Run Code Online (Sandbox Code Playgroud)

在 bash 中(对于使用它的其他答案寻求者),您可以使用 Ksh 样式的扩展 glob:

# If it's not already enabled
shopt -s extglob
mv -- !(my_folder) my_folder
Run Code Online (Sandbox Code Playgroud)

zsh如果启用该ksh_glob选项,您也可以使用该语法。


h3r*_*ler 5

如果除了新子目录之外只有常规文件,您可以使用 find:

find . -type f -maxdepth 1 -exec mv {} my_folder \;
Run Code Online (Sandbox Code Playgroud)

-type f选项只会查找文件(而不是目录)。-maxdepth 1将继续 find 只查找.(不会递归到其他目录中)。在-exec …做你的举动。

在 zsh 中,您可以将其缩写为

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

是的,错误是无害的。