首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将目录层次结构扁平化,在新目录名中保留目录名

将目录层次结构扁平化,在新目录名中保留目录名
EN

Unix & Linux用户
提问于 2019-01-02 14:11:05
回答 2查看 953关注 0票数 7

我想从以下几个方面着手:

代码语言:javascript
复制
.
├── Alan Walker
│   ├── Different World
│   │   ├── 01 Intro.mp3
│   │   ├── 02 Lost Control.mp3
│   │   └── cover.jpg
│   └── Same World
│       ├── 01 Intro.mp3
│       └── 02 Found Control.mp3
├── Aurora
│   └── Infections Of A Different Kind Step 1
│       ├── 01 Queendom.lrc
│       ├── 02 Forgotten Love.lrc
│       └── 03 Gentle Earthquakes.mp3
└── Guns N' Roses
    └── Use Your Illusion I
        ├── 01 Right Next Door To Hell.lrc
        ├── 01 Right Next Door To Hell.mp3
        ├── 02 Dust N' Bones.lrc
        └── 02 Dust N' Bones.mp3

对此:

代码语言:javascript
复制
.
├── Alan Walker - Different World
│   ├── 01 Intro.mp3
│   ├── 02 Lost Control.mp3
│   └── cover.jpg
├── Alan Walker - Same World
│   ├── 01 Intro.mp3
│   └── 02 Found Control.mp3
├── Aurora - Infections Of A Different Kind Step 1
│   ├── 01 Queendom.lrc
│   ├── 02 Forgotten Love.lrc
│   └── 03 Gentle Earthquakes.mp3
└── Guns N' Roses - Use Your Illusion I
    ├── 01 Right Next Door To Hell.lrc
    ├── 01 Right Next Door To Hell.mp3
    ├── 02 Dust N' Bones.lrc
    └── 02 Dust N' Bones.mp3

我找到的现有解决方案中没有一个包括重命名目录本身。很高兴能用zmv来做这件事,但我想不出怎么做。

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2019-01-02 18:43:57

Zsh

未经测试:

代码语言:javascript
复制
zmv -Q '(*)/(*)(/)' '$1 - $2'
rmdir -- *(/^F)

第二行移除所有空目录,甚至删除以前没有文件的目录。可以使用一个自定义的mv包装器来处理这个问题,该包装器记录它从哪个目录中移动东西。

注意,这将遍历指向当前目录中目录的符号链接。

Linux重命名实用程序

未经测试。

代码语言:javascript
复制
rename / ' - ' */*/
rmdir -- */ 2>/dev/null

请注意,这将遍历指向当前目录及其子目录中的目录的符号链接。第二行移除所有空目录,甚至删除以前没有文件的目录。

Perl重命名脚本

未经测试。

代码语言:javascript
复制
prename 's~/~ - ~' */*/
rmdir -- */ 2>/dev/null

请注意,这将遍历指向当前目录及其子目录中的目录的符号链接。第二行移除所有空目录,甚至删除以前没有文件的目录。

这里有一种更复杂的方法,它只删除从其中重命名的目录。再一次,未经测试。

代码语言:javascript
复制
prename 's~([^/]+)/~$1 - ~ and ++$d{$1}; END {map {rmdir} keys %d}' */*/
票数 9
EN

Unix & Linux用户

发布于 2019-01-02 15:00:37

可能是这样吧?

代码语言:javascript
复制
#!/bin/sh

for topdir in */; do
    topdir_name=$( basename "$topdir" )

    for subdir in "$topdir"/*/; do
        subdir_name=$( basename "$subdir" )

        newdir="$topdir_name - $subdir_name"
        if mkdir "$newdir"; then
            mv "$subdir"/* "$newdir"
            rmdir "$subdir"
        fi
    done

    rmdir "$topdir"
done

这通过当前目录中的所有顶级目录(带名)。对于每个这样的目录,它都会遍历其子目录(相册名称)。对于每一对乐队名称和专辑名称,将创建一个新目录,并将子目录中的文件移至该目录。相册子目录在处理后会被移除,原始的带顶级目录也是如此。

如果任何目录包含隐藏的文件名或任何新目录未能创建,则rmdir调用将失败。

这是完全未经测试的代码。在备份的文件副本上运行。

票数 12
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/492030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档