从 Mac OS X 的命令行展平嵌套目录 & 文件层次结构

Anonim

您是否需要扁平化目录结构,将所有文件内容从目录子文件夹移动到单个文件夹中?虽然您可以通过在 Mac OS X 或 Linux 的文件系统中移动文件和文件夹来手动执行此操作,但更快的选择是转向命令行。也许在某个时候你创建了一个嵌套的目录层次结构,你现在需要通过将所有文件从这些嵌套文件夹中移出并返回到一个目录中来撤消,或者你可能正在寻求简化目录结构,无论是什么原因,这把戏效果很好。

使用命令行完成文件和目录结构的扁平化显然最好留给一般习惯使用终端的高级用户,如果这不能描述你,请考虑通过 Finder 手动完成,或使用 Mac Automator 应用程序来完成文件系统活动的类似自动化。然而,我们在这里专注于从命令行进行目录扁平化。

扁平化嵌套文件目录示例

为了更好地理解我们要完成的任务,让我们举一个名为 TestDirectory 的虚构目录结构示例,该目录结构位于用户主文件夹中。在此示例中,TestDirectory 包含子文件夹,如 SubDirectory1、SubDirectory2、SubDirectory3 等,每个文件夹中都有文件。我们在这里要做的是展平目录结构,将所有文件从 SubDirectory(X) 移动到父目录“TestDirectory”。递归显示的初始目录和内容可能如下所示:

$ find ~/TestDirectory/ -type f ~/TestDirectory/rooty.jpg ~/TestDirectory/SampleDirectory1/beta-tool-preview.jpg ~/TestDirectory/SampleDirectory1 /alphabeta-tool.jpg ~/TestDirectory/SampleDirectory2/test-tools.jpg ~/TestDirectory/SampleDirectory3/test-png.jpg ~/TestDirectory/SampleDirectory3/test1.jpg ~/TestDirectory/SampleDirectory3/test2.jpg

To flatten this directory and subdirectory contents out back to the TestDirectory folder, you would use the following command string:

find TargetDirectory/ -mindepth 2 -type f -exec mv -i '{}' TargetDirectory/ ';'

目录内容被展平后,列出来应该是这样的:

~/TestDirectory/rooty.jpg ~/TestDirectory/beta-tool-preview.jpg ~/TestDirectory/alphabeta-tool.jpg ~/TestDirectory/test-tools .jpg ~/TestDirectory/test-png.jpg ~/TestDirectory/test1.jpg ~/TestDirectory/test2.jpg

注意子目录仍然存在,它们只是空的。说得通?如果不是,或者如果那不能证明你想要完成什么,你可能根本不想展平一个目录,也许你正在寻求合并或使用同上到其他地方做一个复杂的复制。

使用命令行展平目录结构和嵌套文件层次结构

准备好继续了吗?我们将用于展平目录结构并将所有文件从子目录移动到目标目录的基目录的命令字符串如下:

find -mindepth 2 -type f -exec mv -i '{}' ';'

替换为您选择的目录以展平,如上例所示。

是的,该目录在命令字符串中出现了两次,第一次是正在搜索的目录以展平其子目录,第二次是找到的项目的目的地。

精确指定目的地,因为这是不可逆的(好吧,至少你不需要做很多手工工作),所以只有在你绝对确定要搬迁时才这样做目标目录子目录下的所有文件回到目标根文件夹

如前所述,您也可以在OS X的Finder中执行此操作,或者至少在Finder中观察文件和文件夹的变化。 Option+单击列表视图中的小箭头打开所有子目录,显示如下文件夹层次结构:

在尝试了各种bash 和zsh 替代方案之后,这个方便的技巧由StackExcange 上的一位评论者留下,它最终成为最简单和最兼容的方法。如果您知道扁平化嵌套目录的更好方法,请在评论中告诉我们!

从 Mac OS X 的命令行展平嵌套目录 & 文件层次结构