如何比较具有不同扩展名的文件列表并删除多余的文件?

如何比较具有不同扩展名的文件列表并删除多余的文件?

我有 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)
  1. 生成文件列表txt
  2. 将其扩展名更改为jpg
  3. 删除列表中不存在的所有内容。

    • -i只是为了安全。

相关内容