Поиск файлов без определенного расширения - PullRequest
1 голос
/ 09 июля 2010

Может кто-нибудь помочь мне с регулярным выражением, которое найдет файлы, которые не имеют расширение .tar.gz

мне нужно, чтобы он работал в моем сценарии Unix

for i in <REGEX for non tar.gx files>
do
something
done

спасибо

Ответы [ 5 ]

3 голосов
/ 09 июля 2010

В bash с включенным extglob (который, по-видимому, используется по умолчанию) вы можете отменить глобус, используя !(<glob>).Итак:

for i in !(*.tar.gz)
do
    something
done

Если вы хотите сопоставить два глобуса, вы должны написать for i in *.tar.gz *~.Точно так же вы можете написать for i in !(*.tar.gz|*~), если хотите сопоставить все файлы, которые не являются ни архивами gzip, ни файлами резервных копий.

3 голосов
/ 09 июля 2010

Никогда, никогда, никогда не используйте регулярные выражения для задачи "сопоставить каждый X, который не соответствует Y". Вместо этого используйте тривиальное регулярное выражение для X и отрицайте результат.

(В выражениях оболочки замените == на != или используйте grep -v. В Perl используйте !~ вместо =~. В JQuery используйте оператор :not и т. Д. Если ваш API не позволяет вам делать что-либо еще, кроме указания одного регулярного выражения, побеждая поставщика по голове с помощью иерархии формальных языков .)

Хомского

Дополняемые регулярные выражения всегда либо неэффективны, не читаемы или специфичны для движка - обычно это все из вышеперечисленного. Просто скажите "нет" злоупотреблению регулярными выражениями, используйте инструменты для задач, в которых они хороши!

1 голос
/ 09 июля 2010

вы также можете использовать find ...

find . -type f -not -iname "*.tar.gz"
1 голос
/ 09 июля 2010

Другая возможность (которая иллюстрирует часто пропускаемую технику) просто:

ls | grep -v 'pdf$'|while read i; do echo "i=$i"; done

Это территория с молотком до трещины для этой конкретной проблемы, но если вам нужно что-то сделатьс набором файлов с немного сложными критериями выбора, это может окупиться довольно быстро.

И это будет работать в любой sh-подобной оболочке.

1 голос
/ 09 июля 2010

Если вы не хотите использовать расширенную глобализацию, вы также можете включить простой тест:

for file in *
do
    if [[ $file != *.tar.gz ]]
    then
        something
    fi
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...