查找基名相同但扩展名不同的文件

查找基名相同但扩展名不同的文件

在一个目录中,如何找到所有基名相同但扩展名不同的文件呢?例如0001.jpg0001.png0001.tiff0002.jpg0002.png

答案1

如果您想要所有唯一的文件名,请执行以下操作:

ls -1 | sed 's/\([^.]*\).*/\1/' | uniq

如果您希望其中多个文件具有相同的基本名称,请使用:

ls -1 | sed 's/\([^.]*\).*/\1/' | uniq -c | sort -n | egrep -v "^ *\<1\>"

对于具有多个句点的文件名,请使用以下命令:

ls -1 | sed 's/\(.*\)\..*/\1/' | uniq -c | sort -n | egrep -v "^ *\<1\>"

答案2

解决方案使用(我避免解析ls输出,它不是为这项任务设计的,可能会导致错误):

perl -E '
    while (<*>){
        ($full, $short) = (m/^((.*?)\..*)$/);
        next unless $short;
        push @{ $h->{$short} }, $full;
    }
    for $key (keys %$h) {
        say join " ", @{ $h->{$key} } if @{ $h->{$key} } > 1;
    }
' /home/sputnick

替换/home/sputnick.或任何您想要的目录;)

答案3

由于这里唯一的答案要么使用sedor perl,要么使用正则表达式,所以我想我会有所不同,并发布一些可能更简单的内容。

for file in /path/to/your/files/*; do echo ${file%%.*}; done | uniq -d

在此示例中,${file%%.*}将文件路径匹配到第一个句点 ( .)。因此,0001.tar.gz将被视为0001.

输出看起来像这样

/path/to/your/files/0001
/path/to/your/files/0002

如果您不想在输出中显示完整路径,只需cd先进入目录,然后运行仅使用星号 ( *) 作为路径的命令。

cd /path/to/your/files
for file in *; do echo ${file%%.*}; done | uniq -d

然后输出看起来像这样

0001
0002

答案4

如果你不害怕解析ls

/bin/ls --color=no -1 | sed 's/\.[^.]*$//' | uniq -d

如果文件名包含新行,则会失败。

相关内容