2013-04-04 3 views
2

Есть ли regex, чтобы найти все файлы, которые не содержат определенный символ? Я знаю, что есть много, чтобы найти строки, содержащие совпадения, но я хочу что-то, что найдет все файлы, которые не содержат мое соответствие.Поиск имен файлов без заданного символа

ответ

1

для Баш - перечислить все файлы в СПРАВОЧНИК:

shopt -s extglob 
ls !(*.*) 

Установка extglob требуется дать возможность! что отрицает . аргумент ls.

+2

Без 'ls', создайте массив:' no_ext_files = (! (*. *)); num = "$ {# no_ext_files [@]}" ' –

+0

@suspectus: Я думаю, что ваше решение (включая ** ls **) не работает, если каталог имеет подкаталоги. – tink

2

Использование ls и sed заменить все имена файлов без расширения (т.е. не содержащий .) с NoExtension:

ls | sed -e 's/^[^.]*$/NoExtension/g' 

замена имен файлов, которые имеют расширение с их расширением:

ls | sed -e 's/^[^.]*$/NoExtension/g' -e 's/.*\.\(.*\)/\1/' 
+1

Добавить 'sort | uniq -c | sort -n' до последней команды, чтобы получить отсортированный счетчик. Более короткая альтернатива: '/\ ./! s/$/NoExtension /. s /.*\.// '. – Thor

0

И решение awk, для хорошей меры.

ls | awk '$0 !~ /\..+$/{a++}END{print a}' 
+0

Это печатает подсчеты, а не имя файла должно быть 'ls | awk '!/\ .. + $ /' ', но вы не хотите разбирать вывод' ls' вообще. –

+0

Мой скрипт awk (счетчик) соответствует его краткому (подсчету файлов без расширения в каталоге) перед редактированием: количество файлов. Для задачи под рукой ** ls ** вполне адекватно, я не разбираю ничего, кроме имен файлов. – tink

+1

Разбор 'ls' никогда не безопасен http://mywiki.wooledge.org/ParsingLs –

0

Это может работать для вас (найти, GNU СЭД & туалет):

find . -type f | sed -rn '\|.*/\.?[^.]+$|w NoExtensions' && wc -l NoExtensions 

Это дает вам количество и список.

N.B. dot файлы без расширений включены.

1

Вы должны отказаться от всех ответов, которые анализируют вывод ls, чтобы прочитать почему-то here. Инструмент find идеально подходит для этого.

# Show files in cwd 
$ ls 
file file.txt 

# Find the files with an extension 
$ find -type f -regex '.*/.*\..*$' 
./file.txt 

# Invert the match using the -not option 
$ find -type f -not -regex '.*/.*\..*$' 
./file 
Смежные вопросы