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

OS X 中的终端 创建了一个嵌套的目录层次结构,你现在需要通过移动所有文件来撤销从这些嵌套文件夹中取出并返回到单个目录中,或者您可能希望简化目录结构,无论出于何种原因,这个技巧都非常有效。

使用命令行来完成文件和目录结构的扁平化显然最好保留给一般习惯使用终端的高级用户,如果这不能描述你,请考虑通过 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

要将此目录和子目录内容展平回 TestDirectory 文件夹,您可以使用以下命令字符串:

找到 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

注意子目录仍然存在,它们只是空的。合理?如果没有,或者如果那不能证明你想要完成什么,你可能根本不想展平一个目录,也许你正在寻求合并或 use ditto 将复杂的副本复制到其他地方。

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

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

find [DIRECTORY] -mindepth 2 -type f -exec mv -i '{}' [DIRECTORY] ''

将 [DIRECTORY] 替换为您选择的要展平的目录,如上例所示。

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

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

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

要展平的嵌套目录结构,如 Finder 中所示Mac OS X

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