![如何比较具有不同扩展名的文件列表并删除多余的文件?](https://linux22.com/image/1167300/%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E5%85%B7%E6%9C%89%E4%B8%8D%E5%90%8C%E6%89%A9%E5%B1%95%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6%E5%88%97%E8%A1%A8%E5%B9%B6%E5%88%A0%E9%99%A4%E5%A4%9A%E4%BD%99%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有 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
只是为了安全。