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

ous*_*lmi 4 command-line bash

我有 2 个文件夹,一个包含图像文件,第二个包含文本文件,每个文本文件与图像文件同名,并包含有关图像的信息。例如:

   -Labels:
     -1.txt
     -2.txt
     -3.txt
     -6.txt
   -Images:
     -1.jpg
     -2.jpg
     -3.jpg
     -4.jpg
     -5.jpg
     -6.jpg
Run Code Online (Sandbox Code Playgroud)

我想删除没有文本文件的图像(在这个例子中:4.jpg,5.jpg),我找到了一种如何确定不同文件的方法,但我无法删除它们。

diff <(ls -1 ./Images | sed s/.jpg//g) <( ls -1 ./Labels | sed s/.txt//g)
Run Code Online (Sandbox Code Playgroud)

pa4*_*080 7

这是一个可以帮助您解决此任务的小型 bash 脚本:

#!/bin/bash
for file in Images/*.jpg
do
    if [[ ! -f "Labels/$(basename ${file%.*}).txt" ]]
    then
        echo rm "$file"
    fi
done
Run Code Online (Sandbox Code Playgroud)
  • 删除echo以进行实际更改。

脚本必须在父目录中执行,这里它被格式化为内联命令:

for f in Images/*.jpg; do if [[ ! -f "Labels/$(basename ${f%.*}).txt" ]]; then echo rm "$f"; fi; done
Run Code Online (Sandbox Code Playgroud)


Dri*_*ies 5

我想我会这样做:

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
Run Code Online (Sandbox Code Playgroud)

如果你想确保它有效,在实际使用它之前先试试这个:

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
Run Code Online (Sandbox Code Playgroud)

它将显示将执行哪些命令。