2010-07-09 2 views
1

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

мне нужно работать в моем UNIX скрипт

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

спасибо

+0

Обратите внимание, что 'для я в blah' не использует регулярные выражения, он использует расширение оболочки имени пути. –

ответ

3

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

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

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

3

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

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

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

1

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

for file in * 
do 
    if [[ $file != *.tar.gz ]] 
    then 
     something 
    fi 
done 
1

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

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

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

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

+0

Но он не работает с именами файлов с контрольными символами, так как 'ls' пытается их дезинфицировать. – Philipp

+0

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

1

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

find . -type f -not -iname "*.tar.gz" 
Смежные вопросы