在尝试在 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
以一次性删除所有空目录。