将多个文件夹和文件移动到其多个父文件夹中

将多个文件夹和文件移动到其多个父文件夹中

我需要找到所有名为“test”的文件夹,并将所有文件夹连同里面的文件一起移动到它们的父文件夹中:

html/folder1/js/test -> html/folder1/test

html/folder2/js/test -> html/folder2/test

超过 500 个文件夹

答案1

您可以使用for目录中的循环来执行此操作,该目录是等的父目录folder1folder2示例html中的目录),因此首先cd对其进行(用实际路径替换:

cd /PATH/TO/html

在此命令中,如果您要移动的名称不是testtest用真实名称替换或使用 * 移动所有内容:

for dir in ./* ; do mv "$dir"/*/test "$dir"/ ; done

这会将test当前工作目录的子目录中的所有内容(如果是目录,则包括它们的所有内容)移动到它们的父目录,但不会删除子目录本身(因此js在您的示例中,不会被删除)

例子:

前:

.
├── 15
│   └── rainbow
│       ├── test
│       └── fun

后:

.
├── 15
│   ├── rainbow
│   └── test
│       └── fun

对于不具有此结构和匹配内容的目录,该命令将引发错误,但它仍会执行您想要的操作,因此请忽略此错误,或通过附加2>/dev/null

for dir in ./* ; do mv "$dir"/*/test "$dir"/ ; done 2>/dev/null

答案2

find folder* -name 'test' -exec mv {} {}/../.. \;

解释

find folder*在任何./folder*(全局模式通过 shell 扩展)

-name 'test'对于名为 的文件test

-exec mv {} {}/../.. \;将它们移至上两个级别1 .{}替换为找到的名称。该-exec选项必须以转义的分号结尾。您可以通过echo在 之前添加 来进行试运行mv

1为什么要向上两层?如果我们将文件夹移动到其父文件夹中,我们会要求将其设为其当前超级文件夹的子文件夹,因此它将保留在当前位置。但是,我们希望将其移动为父文件夹的父文件夹的子文件夹。展开的命令将看起来像 ,mv folder1/js/test folder1/js/test/../..展开为mv folder1/js/test folder1

笔记

执行此命令将会发出类似以下警告:

find: ‘folder1/js/test’: No such file or directory

因为它正在尝试搜索该文件夹已被移动。可以通过指定 来静音2> /dev/null

相关内容