如何查找所有没有匹配文件的文件名称相同但扩展名不同的文件

我有超过100万个文件的文件夹。 文件进来的夫妇,只有不同的扩展名(例如a1.ext1 a1.ext2,a2.ext1,a2.ext2 …)

我需要扫描这个文件夹,并确保它符合这个要求(文件耦合),如果我find一个文件没有匹配我应该删除它。

我已经在python中完成了它,但是当处理7位数的文件时,它的速度非常慢。

有没有办法做到这一点使用shell命令/脚本?

建立在另一个答案上,你可以使用这样的脚本(它应该在文件所在的同一个目录中,并且应该在那里执行):

#!/usr/bin/env bash THRASH=../THRASH mkdir "$THRASH" 2> /dev/null for name in $(ls *.{ext1,ext2} | cut -d. -f1 | sort -u); do if [ $(ls "$name".{ext1,ext2} 2> /dev/null | wc -w) -lt 2 ]; then mv "$name".{ext1,ext2} "$THRASH" 2> /dev/null fi; done 

您可以通过修改THRASH变量来配置移动文件的THRASH

在3.0 GHz双核奔腾处理器和2 GB RAM的情况下,一次运行需要63.7秒(10000对,文件夹中缺少每对成员约1500个)。

试试这个:

 #!/bin/bash for file in *.ext1 *.ext2 do #name is the substring before the '.' name=${file%.*} #ext is the substring after the '.' ext=${file#*.} case $ext in "ext1") sibling="$name.ext2"; #does it haves a sibling? #if it does not,remove the file ls | grep $sibling >/dev/null; if [ $? -ne 0 ] then rm $file fi;; "ext2") sibling="$name.ext1"; #does it haves a sibling? #if it does not,remove the file ls | grep $sibling >/dev/null; if [ $? -ne 0 ] then rm $file fi;; esac done 

Python应该更快; 但是,如果你想尝试在bash中:

 for file in $(ls | cut -d. -f1 | sort -u); do if [ $(ls $file.* | wc -l) -ne 2 ]; then echo "too much extension for $file" fi done 

这应该显示多于或少于两个扩展名的文件名。