我想从以下几个方面着手:
.
├── 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对此:
.
├── 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来做这件事,但我想不出怎么做。
发布于 2019-01-02 18:43:57
未经测试:
zmv -Q '(*)/(*)(/)' '$1 - $2'
rmdir -- *(/^F)第二行移除所有空目录,甚至删除以前没有文件的目录。可以使用一个自定义的mv包装器来处理这个问题,该包装器记录它从哪个目录中移动东西。
注意,这将遍历指向当前目录中目录的符号链接。
未经测试。
rename / ' - ' */*/
rmdir -- */ 2>/dev/null请注意,这将遍历指向当前目录及其子目录中的目录的符号链接。第二行移除所有空目录,甚至删除以前没有文件的目录。
未经测试。
prename 's~/~ - ~' */*/
rmdir -- */ 2>/dev/null请注意,这将遍历指向当前目录及其子目录中的目录的符号链接。第二行移除所有空目录,甚至删除以前没有文件的目录。
这里有一种更复杂的方法,它只删除从其中重命名的目录。再一次,未经测试。
prename 's~([^/]+)/~$1 - ~ and ++$d{$1}; END {map {rmdir} keys %d}' */*/发布于 2019-01-02 15:00:37
可能是这样吧?
#!/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调用将失败。
这是完全未经测试的代码。在备份的文件副本上运行。
https://unix.stackexchange.com/questions/492030
复制相似问题