将除一个子文件夹之外的所有子文件夹移至该子文件夹中

将除一个子文件夹之外的所有子文件夹移至该子文件夹中

我有一个名为 的目录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(第一个cdtemp):

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

相关内容