我有一个名为 的目录temp
。在这个文件夹中,我有多个子文件夹(我不知道确切的数量)。现在我在temp
名为 的内部创建另一个子文件夹Untitled
。现在我想将所有其他子文件夹移到里面Untitled
。
假设我在 temp 中有 3 个文件夹,分别名为 a、b、c。现在我创建Untitled
.所以 temp 现在包含 4 个文件夹 a、b、c 和 Untitled。执行操作后,temp 将仅包含 Untitled 文件夹,其中 Untitled 包含 a、b、c。
我如何使用 bash 来实现这一点?
我的 Bash 版本(在 Ubuntu 16.04 上)
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
答案1
简而言之,并且没有错误,您可以使用 bash 的扩展通配符来排除您想要省略的一个目录:
shopt -s extglob
mv -- !(Untitled) Untitled
确保打开扩展通配符后,该mv
命令的工作方式是将第一个参数 ( !(Untitled)
) 扩展到当前目录中的每个文件和目录除了名为“无题”的作品。然后,所有这些文件和目录都会移至该Untitled
目录中。
如果你只想搬家目录从当前目录进入Untitled,然后添加一个字符:
shopt -s extglob
mv -- !(Untitled)/ Untitled
...其中尾部/
强制 bash 匹配目录而不是文件。
上面将默认省略点文件(例如.subdir
)。如果您也想选择这些,只需添加:
shopt -s dotglob
有关这些 shell 选项的更多信息,请参阅:
答案2
假设您只有主文件夹中的文件夹,最简单的方法是从temp
(第一个cd
到temp
):
mv * Untitled
你会得到一个错误,说:
mv: cannot move 'Untitled' to a subdirectory of itself, 'Untitled/Untitled'
如果这对您来说是个问题,您可以使用循环*
并逐个移动每个文件,跳过目标子文件夹。
$ mkdir a b c
$ target_dir=Untitled
$ mkdir "$target_dir"
$ for f in *; do
if [ "$target_dir" == "$f" ]; then continue; fi; mv "$f" "$target_dir"; done
$ ls
Untitled
$ ls Untitled/
a b c
如果有要跳过的文件,请在命令之前添加循环内的条件mv
。