OS X Найти в bash с символами регулярных выражений \ не дает ожидаемых результатов - PullRequest
9 голосов
/ 23 марта 2012

Я использую следующую команду regex find в терминале OS X, чтобы найти целую загрузку файлов с 8-значными именами файлов с последующим расширением .jpg, .gif, .png или .eps Следующее не дает никаких результатов, хотя я сказал OS X / BSD найти использовать современное регулярное выражение

find -E ./ -iregex '\d{8}'

Использование http://rubular.com/ (http://rubular.com/r/YMz3J8Qlgh) показывает, что шаблон регулярного выражения дает ожидаемые результаты, а OS X выдает результаты при наборе

find . -iname '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].*'

Но это кажется немного длинным.

Ответы [ 5 ]

10 голосов
/ 21 апреля 2012

Эти команды работают на OSX

find -E . -iregex '.*/[0-9]{8}\.(jpg|png|eps|gif)'

эта команда соответствует 12345678.jpg, а не 123456789.jpg


find -E . -iregex '.*/[0-9]{8,}\.(jpg|png|eps|gif)'

эта команда соответствует 12345678.jpg и 123456789.jpg


.*/ 

равно пути к папке или пути к подпапке

2 голосов
/ 12 сентября 2012

Со всеми вашими ответами я наконец смог использовать OSX find (10.8.1) с регулярным выражением. Для возврата вот мои выводы: Мы используем пользовательские строки для идентификации клипов, шаблон выглядит так: "YYMMDDabc ## abc * .ext": год / месяц / день / 3 знака / 2 знака / 3 знака / что угодно / ext

find -E /path/to/folder -type f -regex '^/.*/[0-9]{6}[A-Za-z]{3}[0-9]{2}[A-Za-z0-9]{3}\.*.*\.(ext)$'

Начальная буква ^ гарантирует, что шаблон находится в начале поиска, [0-9] {6} ищет 6-значную строку, \ d не работает. \ D не работает для писем, A-Za-z работает. $ В конце гарантирует, что последний поиск является концом строки.

После прочтения справочной страницы Apple о find и re_format я был совершенно не в курсе экранирования символов.

1 голос
/ 23 марта 2012

man re_format объясняет особенности современного регулярного выражения, которое find примет.

Это работает для меня: -iregex '[0-9]{8}'

0 голосов
/ 05 августа 2014

Я использую это регулярное выражение для поиска и удаления дубликатов iPhone:

найди -Е. -regex '. * / IMG_ [0-9] {4} [] 1.JPG' -print -exec rm '{}' \;

0 голосов
/ 06 марта 2013

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

В моем случае у моего мака была куча дубликатов фотографий. Когда максы создают дубликаты, они добавляют пробел и число в конце перед расширением.

IMG_0001.JPG может иметь комплекс множественности с IMG_0001 2.JPG, IMG_0001 3.JPG и так далее. В моем случае это продолжалось до 2600 бесполезных файлов.

Чтобы все накачать, я перешел к рассматриваемой папке.

cd ~/Pictures/

Далее, давайте докажем себе, что мы можем перечислить все файлы в каталоге. Вы заметите, что в регулярное выражение необходимо включить . с надписью «искать в этом каталоге». Кроме того, вы должны соответствовать полному имени файла, поэтому .+ необходим для перехвата всех остальных символов.

find -E . -regex '\..+'

Соответственно, результаты приведут к строкам, которым вы должны соответствовать, включая ., о котором я упоминал ранее, косую черту / и все остальное.

./IMG_1788.JPG
./IMG_1789.JPG
./IMG_1790.JPG
./IMG_1791.JPG

Так что я не могу написать это, чтобы найти дубликаты, потому что он не содержит "./"

find -E . -regex 'IMG_[0-9]{4} .+'

но я могу написать это, чтобы найти дубликаты, потому что он включает "./"

find -E . -regex '\./IMG_[0-9]{4} .+`

или более модная версия с .*/, как упомянуто @ jackjr300, делает то же самое.

find -E . -regex '.*/IMG_[0-9]{4} .+`

Наконец, запутанная часть. \d не распознается в BSD. [0-9] работает так же хорошо. Ответы других пользователей цитировали руководство re_format , в котором указано, как писать общие шаблоны, заменяющие такие вещи, как \d, с забавным синтаксисом с квадратным двоеточием, который выглядит следующим образом: [:digit:]. Я пытался и пытался, но это никогда не работает. Просто используйте [0-9]. В моем случае я потратил кучу времени, думая, что должен был использовать [:space:] вместо пробела, но я обнаружил (как обычно!), Что мне просто нужно было дышать и действительно читать регулярное выражение. Это оказалось моей ошибкой. :)

Надеюсь, это кому-нибудь поможет!

...