我有 2 个文件夹,一个包含图像文件,另一个包含文本文件,每个文本文件都与图像文件具有相同的名称,并包含有关图像的信息。例如:
-Labels:
-1.txt
-2.txt
-3.txt
-6.txt
-Images:
-1.jpg
-2.jpg
-3.jpg
-4.jpg
-5.jpg
-6.jpg
我想删除没有文本文件的图像(在此示例中为:4.jpg,5.jpg),我找到了一种如何确定不同文件的方法,但我无法删除它们。
diff <(ls -1 ./Images | sed s/.jpg//g) <( ls -1 ./Labels | sed s/.txt//g)
答案1
这是一个小型 Bash 脚本,可以帮助您解决此任务:
#!/bin/bash
for file in Images/*.jpg
do
if [[ ! -f "Labels/$(basename ${file%.*}).txt" ]]
then
echo rm "$file"
fi
done
- 删除
echo
以进行实际更改。
该脚本必须在父目录中执行,这里将其格式化为内联命令:
for f in Images/*.jpg; do if [[ ! -f "Labels/$(basename ${f%.*}).txt" ]]; then echo rm "$f"; fi; done
答案2
我想我会这样做:
for i in Images/*; do file=`echo $i | sed -e 's/jpg/txt/' -e 's/Images/Labels/'`; if [ ! -f "$file" ] ; then rm $i ; fi; done
如果您想确保它有效,在实际使用它之前请先尝试以下操作:
for i in Images/*; do file=`echo $i | sed -e 's/jpg/txt/' -e 's/Images/Labels/'`; if [ ! -f "$file" ] ; then echo rm $i ; fi; done
它将显示将执行哪些命令。
答案3
cd /path/to/Images
LIST=$(find /path/to/Labels -iname *.txt -printf "%f|" | sed 's/.txt/.jpg/g')
rm -i !($LIST)
- 生成文件列表
txt
。 - 将其扩展名更改为
jpg
。 删除列表中不存在的所有内容。
-i
只是为了安全。