我需要找到所有名为“test”的文件夹,并将所有文件夹连同里面的文件一起移动到它们的父文件夹中:
html/folder1/js/test -> html/folder1/test
html/folder2/js/test -> html/folder2/test
超过 500 个文件夹
答案1
您可以使用for
目录中的循环来执行此操作,该目录是等的父目录folder1
(folder2
示例html
中的目录),因此首先cd
对其进行(用实际路径替换:
cd /PATH/TO/html
在此命令中,如果您要移动的名称不是test
则test
用真实名称替换或使用 * 移动所有内容:
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
。