2014-11-19 2 views
1

У меня есть следующие проблемы: У меня есть список файлов, как этотНайти имена файлов с номером в названии ниже 1950

File256name.txt 
File307list.cvs 
File2014text.xls 

я хотел бы использовать команду «найти», чтобы найти только файлы с номером в названии ниже, чем 1950, так как в предыдущем списке, я бы только эти файлы перечислены

File256name.txt 
File307list.cvs 

Я попробовал эту команду

find . -type f \(-iname '*[1-9][0-9][0-9]*' \) 

, но он отобразит также файлы, содержащие номер в названии> 1950

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

Также рассмотрим ограничение моей Linux версии, которая BusyBox v1.16.1

Спасибо за ваш help

+0

У вас есть awk? –

+0

Да, awk доступен – Maxrock70

ответ

2

Вам нужно будет использовать регулярное выражение, которое будет отличаться ciate десятилетие в отношении века:

.*(19[5-9][0-9]|[2-9][0-9]{3}).* 

(Найдет 4-значные числа больше или равные 1950).

Используя это регулярное выражение, вы можете использовать опцию отрицания find для получения файлов без номера> = 1950. Чтобы исключить файлы без какого-либо числа, используйте второй критерий.

Я не проверял это с находкой, но регулярное выражение вы используете позволяет 1000 < 1950.

Edit:

Полная команда:

find . -regextype posix-egrep -regex '.*[0-9].*' \! -regex '.*(19[5-9][0-9]|[2-9][0-9]{3}).*' 

С BusyBox найдем еще немного требуется экранирование:

find . -regex '.*[0-9].*' \! -regex '.*\(19[5-9][0-9]\|[2-9][0-9]\{3\}\).*' 
+0

Пример OP включает файлы только с 3-мя номерами –

+0

@Jidder: Что тоже будет работать. Регулярное выражение соответствует номерам> = 1950 (которые по меньшей мере равно 4 цифрам), а затем отрицает результат. Таким образом, регулярное выражение не соответствует 3-значным номерам, и из-за отрицания критерии поиска будут соответствовать (что подходит для всех чисел <1000). – urzeit

+0

Не могли бы вы предоставить мне полную команду для использования? – Maxrock70

3

Труба в (G) awk

find . -type f | awk 'match($0,/[0-9]+/,a)&&a[0]<1950' 

Это соответствует только файлам с номерами, а затем проверяет, находится ли число ниже 1950 года и печатает. он будет работать для файла только с 1 знаком или с 4, а также с ведущими нулями.

+0

Я пробовал вашу команду, но я все равно получаю оба файла MyNas> find/volume1/homes/admin/tmp/-type f | awk '($ 0,/[0-9] + /, a) && a [0] <1950' /volume1/homes/admin/tmp/ciccio2014ooo.txt /volume1/homes/admin/tmp/ciccio306oooo. cvs – Maxrock70

+0

Являются ли те результаты или вы передали эти файлы awk? –

+0

Проверьте версию Awk, совпадение доступно только в GAWK, возможно, я должен был упомянуть об этом, извините :( –

0

Это может быть сделано просто в Баше с символьных классов и удалением подстроки:

#!/bin/bash 

for i in "[email protected]"; do 
    ffn="${i##*/}" 
    num="${ffn//[^0-9]/}" 
    [ "$num" -le 1950 ] && echo "$i => $num" 
done 

вход:

File1949text.doc 
File1950text.doc 
File1951text.dat 
File2014text.xls 
File256name.txt 
File307list.cvs 

выход:

$ bash ../fn1950.sh File* 
File1949text.doc => 1949 
File1950text.doc => 1950 
File256name.txt => 256 
File307list.cvs => 307 
+0

ОР использует BusyBox Не Баш – urzeit

+0

можно ли это сделать.. с командой find только – Maxrock70

+0

Ой, извините, я не обратил внимания на требование busybox. Я искал что-то с 'find', но не мог найти ничего, что было бы ** другим/более эффективным **, чем подход' regex', сделанный urzeit, но не нашел. Извините за путаницу. –

Смежные вопросы