在一个目录中,如何找到所有基名相同但扩展名不同的文件呢?例如0001.jpg
和0001.png
和0001.tiff
和0002.jpg
和0002.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
由于这里唯一的答案要么使用sed
or 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
如果文件名包含新行,则会失败。