2016-05-25 2 views
1

Я хочу, чтобы напечатать все имена файлов, которые не делают «содержат только цифры»:Ubuntu AWK - печать имен файлов, которые содержат ничего, кроме цифр

Это мой код до сих пор:

find . -type f | awk '!/[[:digit:]]/ {print}' 

Это находит меня каждый файл, не содержащий цифр.

Моя проблема также в том, что он также проверяет имена каталогов.

Новейший код:

find . -type f | awk '/.*\W.*/ {print}' 

Я думаю, что это работает, но он также проверяет имя директории, я забочусь только о файлах

+0

перефразировать вопрос, последнюю строку и первую строку не соответствует – piyushj

+0

нет букв и цифр? – Inian

+0

Я отредактировал вопрос. Извините за проблемы, вы можете проверить это сейчас? – Piodo

ответ

4

Если я вас правильно понял:

Чтобы напечатать все имена файлов, которые не делают "содержат только цифры":

find . -type f -printf '%f\n'| awk '/[^[:digit:]]/ {print}' 

Нет каталогов не включены.


Если вы хотите, чтобы все имена файлов, которые не «содержат цифры или буквы»:

find . -type f -printf '%f\n'| awk '/[^[:alnum:]]/ {print}' 

Но я считаю, что было бы разумно включить точку . и пространство .
Символы, которые обычно используются в именах файлов:

find . -type f -printf '%f\n'| awk '/[^[:alnum:]. ]/ {print}' 

The (Отрицаемые) Shorthand Character Class\W также будет включать в себя _ подчеркивание, и является менее переносимым (это расширение ГНУ).

Я не знаю, хотите ли вы включить это или нет.

+0

Я редактировал вопрос, его плохо. Но я поменял регулярное выражение на '/.* \ W. * /' И его работы. Благодаря ! – Piodo

+0

@Piodo Пожалуйста, прочитайте расширенный ответ о письмах и '\ W'. –

0

Как насчет полагаться только на find?

find . -type f -name '*[^0-9]*' 
3

Более простым решением было бы

find . -type f -regextype sed -not -regex '^[./[:digit:]]\+$' 

Здесь -not -regex является эквивалентом !p в СЕПГ.

Если вы имеете дело с нестандартными именами файлов сделать:

find . -type f -regextype sed \ 
     -not -regex '^[./[:digit:]]\+$' \ 
     -print0 | while read -r -d '' line 
do 
    echo "$line" 
done 

Пример вывода

./binaryzebra8 
./foo 
./bingo bar 
./bar 
./file 
./romeo 
juliet --> non-standard file name 
./888/bingo88 
./\hash --> non-standard file name 

-printf "%f\n" как упомянуто в @ ответ BinaryZebra дает вам basenames файлов поскольку [ manpage ] говорит:

% f Имя файла с удаленными ведущими каталогами (только последний элемент ).

, но на практике вам нужен полный путь к файлам, если вы действительно обрабатываете результаты поиска.

0

Другая возможность, просто я не собираюсь использовать awk, как это труднее отрицать шаблон поиска по отношению к простым grep -v

find . -type f | grep -v '^[0-9]*$' 
Смежные вопросы