我有 2 个带有子目录的文件夹。一张带有训练图像,一张带有训练标签。
- 一张图像恰好属于一个标签
- 图片和标签内容不同
- 图像和标签可以在类似的路径中找到。例如:
- 图片/18/1334/图像1。网页文件
- 标签/18/1334/图像1。PNG
- 文件名(不是扩展名)相同
- 一个子目录下可以有多个文件
如何删除每个没有相应图像的标签(反之亦然)?例如:
图片:
.
|---18
|---a1
| |---a1.webp
| |---a11.webp
|---a2
| |---a2.webp
|---a3
标签
.
|---18
|---a1
| |---a1.png
| |---a11.png
|---a2
| |---a2.png
|---a3
|---a3.png
好的解决方案(如果没有相应的标签或图像,则删除文件):
.
|---18
|---a1
| |---a1.*
| |---a11.*
|---a2
| |---a2.*
|---a3
最佳解决方案(也删除现在为空的文件夹):
.
|---18
|---a1
| |---a1.*
| |---a11.*
|---a2
|---a2.*
星号* 代表 webp 或 png。
答案1
与find
和bash
:
cd
到 and 的父目录images
并labels
运行:
find . \( -name "*.webp" -o -name "*.png" \) -type f -exec bash -c '
if [ "${1##*.}" = "webp" ]; then
file=${1/\/images\//\/labels\/}
file=${file%webp}png
else
file=${1/\/labels\//\/images\/}
file=${file%png}webp
fi
[ ! -f "$file" ] && echo rm "{}"
' bash {} \;
您需要删除echo
才能真正删除文件。
要删除空目录,请参阅如何删除子树中的所有空目录?。