2016-05-25 3 views
0

Я хотел бы найти все файлы, в которых первая часть имени файла (до первого .) соответствует расширению файла (после последнего .).Найти файлы, где указаны префикс и суффикс

Например, следующие файлы будут соответствовать:

cat.cat 
cat.txt.cat 

В то время как cat.txt.asm не будет.

Как это сделать, используя find?

+0

Да. Вы должны использовать find для этого. Но ваш вопрос написан довольно запутанным образом. – khrm

+0

Пожалуйста, дайте нам ввод и вывод, если английский не является вашим первым языком. – khrm

+0

Хорошо, еще раз. Для скрипта я даю один аргумент, который является деревом каталогов. Затем он должен перебирать все свои файлы и искать те, которые один из расширений (после точки) совпадает с именем до этой точки - filename.filename – moodym

ответ

-1

К сожалению, это лучше:

Вы можете просто сделать это:

для Exemple найти toto.tata.toto конкретны:

find . -regex ".*\(toto\)[^\/]*\.\1" 

Generic:

find . -regex ".*/\([^./\]*\)[^\/]*\.\1" 
+0

Регулярное выражение неверно. Он не будет соответствовать правильным файлам, и он не будет соответствовать всем им. –

4

Используйте опцию -regex для find:

find -regex '.*/\([^.]+\)\.\(.*\.\)?\1' 
  • .*/ соответствует пути к файлу
  • \([^.]+\) улавливает что-нибудь до первой точки (+ означает, по меньшей мере, один символ)
  • \(.*\.\)? соответствует средней части, то есть что-то заканчивается в точке, но все это не является обязательным
  • \1 означает, что первый захват повторяется

Может быть более читаемым в диалекте задать расширенное:

find -regextype egrep -regex '.*/([^.]+)\.(.*\.)?\1' 
+0

Мои глаза болят, но я думаю, что это правильно! –

1
find . -type f -iname "*" | awk -F/ '{print $2}' |awk -F. '$1==$NF' 

Or 

    ls -1 | awk -F. '$1==$NF' 
Смежные вопросы