Если у вас есть среда GNU, вот решение Rombust , которое печатает общие базовые имена, Использование GAWK
(просто для смешивания):
find . -maxdepth 1 -type f -printf "%f\0" |
gawk 'BEGIN{RS="\0"} {sub(/\.[^.]+$/,""); if (length($0))printf("%s\0",$0)}' |
sort -z | uniq -zd |
tr '\000' '\n'
Это использует Найти
с \ 0 (Nul) разграниченными именами файлов, Gawk
с RS
(Рекордный сепаратор) Установите на \ 0, чтобы соответствовать входу и A Sub (/ Regex /)
, чтобы разделить расширение.
Команда TR
отменяет разграничение Nul для печати на экран, опустите это для дальнейшей (безопасной) обработки имена файлов .
(Обычно я бы сделал что-то вроде , что бы ни было | Rev | Cut -D. -F2- | Rev | Сортировка
, но Rev
не делает Nul-delimited вход.
Если вы хотите ограничить его только файлами с помощью .ext
или более конкретным шаблоном, вы можете использовать:
find . -maxdepth 1 -type f -name "*.*" -printf "%f\0" | ...
Первая опция выше только печатает общую базу, если вы хотите распечатать Фактические имена файлов:
find . -maxdepth 1 -type f -name "*.*" -printf "%f\0" |
gawk 'BEGIN{ RS="\0" }
{ base=$0;sub(/\.[^.]+$/,"",base);seen[base][FNR]=$0}
END { for (bb in seen)
if (length(seen[bb])>1)
for (ff in seen[bb]) printf("%s\0",seen[bb][ff])
}' |
tr '\000' '\n'
(минимум GAWK V4.0, необходимый для многомерных массивов!)
Это использует массив (HASH) [] []
, чтобы кэш виден имена файлов, выявленные в базовом имени, Затем в конце его итерации на основе базовых имен в видны [BB]
и распечатывают те, которые с более чем совпадают ( длиной (видно [BB])> 1
).