文件夹结构混乱。有没有办法删除除一个之外的空子文件夹?

文件夹结构混乱。有没有办法删除除一个之外的空子文件夹?

在尝试在 Debian 机器上重新组织我的电影文件夹后,我最终得到了这样的结构:

├── Universal.Love(2017)(1080p)
│   └── Universal.Love(2017)(1080p)
│       └── Universal.Love(2017)(1080p)
│           └── Universal.Love(2017)(1080p).mkv
│               └── Universal.Love(2017)(1080p).mkv.mkv
├── Unknown.User.2014.German.DTS.DL.1080p.BluRay.x264-EXQUiSiTE
│   └── exq-unknownuser-1080p
│       └── exq-unknownuser-1080p
│           └── exq-unknownuser-1080p
│               └── exq-unknownuser-1080p.mkv
├── Unsane.2018.1080p.BluRay.x264-DRONES
│   └── Unsane.2018.1080p.BluRay.x264-DRONES
│       └── Unsane.2018.1080p.BluRay.x264-DRONES
│           └── Unsane.2018.1080p.BluRay.x264-DRONES
│               └── Unsane.2018.1080p.BluRay.x264-DRONES.mkv
├── Untitled (2017)
│   └── Untitled.2017.WEBDL-1080p
│       └── Untitled.2017.WEBDL-1080p
│           └── Untitled.2017.WEBDL-1080p
│               └── Untitled.2017.WEBDL-1080p.mkv

是否有可能仅在一个子文件夹中包含 .mkv

答案1

shopt -s globstar nullglob
for dir in ./*/; do
    for file in "$dir"/**/*.mkv; do
        [ ! -f "$file" ] && continue
        mv -i "$file" "$dir"
    done
done

上面的双循环可以解决您的问题。

它通过迭代当前目录(应该是保存所有这些顶级目录的目录)中的目录来实现此目的。对于每个目录,.mkv该目录下任何位置的所有文件都会上移到子目录中。这是通过**glob来完成的bash,其中递归地匹配子目录。

启用shellglobstar选项可以使用**,并且nullglob如果没有给定模式的匹配项,则循环根本不会运行。

然后您可以使用以下命令删除空目录

find . -type d -empty -delete

答案2

尝试这个,

find . -mindepth 3 -type f -name "*.mkv" -exec sh -c '
    f="$1"; IFS=/ && set -- $f; echo mv -t "$2" "$f"
' find-sh {} \;

(如何找到第一个子文件夹:通过

echo检查输出时删除。
这会将结构中深度超过 2 层的所有 *.mkv 文件移动到当前目录的第一个子目录。

然后你可能想删除空目录:

find . -type d -empty -delete

答案3

尝试这个,

find . -maxdepth 1 -type d ! -name '.' | while read -r folder; do
        find $folder -type f -name '*.mkv' -exec mv {} $folder \;
        find $folder -type d -empty -delete
done
  • 第一个find将获取所有主目录列表。
  • 第二步find会将可用的 .mkv 文件移动到主目录。
  • 第三步find将删除主目录中的所有空目录。

注意:我们还可以将第三个移出find循环while以一次性删除所有空目录。

相关内容