2017-01-15 2 views
0

У меня есть несколько файлов в папке, и их имена файлов содержат буквенно-цифровые значения. Напр. 045_gfds.sql, 46kkkk.sql, 47asdf.sql и т. Д. Я хочу сравнить числа в этих именах файлов с другим номером, хранящимся в переменной, позволяет сказать $ × = 45 и найти файлы, которые больше, чем число, содержится в имени файла. Я использую Cygwin и в настоящее время могу получить только цифры, используя команду egrep. например.Как сравнить номер с именами файлов в BASH

filename="C:\scripts" 
dir $filename | egrep -o [0-9]+ 

Выход: 045 46 47

Я хочу, чтобы результат как имя файла после сравнения больше, чем $ = 45 со всеми именами, как:

46kkkk.sql 
47asdf.sql 

Нужна помощь с регулярными выражениями для сравнения больше чем значения в имени файла.

+1

Это похоже на вопрос о [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/). Но, возможно, нет. Я советую вам объяснить **, что ** вы хотите достичь, а не ** как ** вы пытаетесь достичь. Вероятно, это лучшее решение. Читайте здесь: [Вопрос XY] (http://xyproblem.info/). – giusti

+0

Спасибо giusti, я хочу, чтобы вывести имена файлов, которые содержат число в имени файла больше $ x = 45. пожалуйста, дайте мне знать, если вам нужна дополнительная информация, чтобы уточнить мой вопрос. –

ответ

0
#!/bin/bash 

dir="$1" 

print_if_greater="45" 

for fname in "$dir"/[0-9]*; do 
    num="${fname##*/}"  # isolate filename from path 
    num="${num%%[^0-9]*}" # extract leading digits from filename 

    if ((num > print_if_greater)); then 
     printf '%s\n' "$fname" 
    fi 
done 

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

Имя файла удаляется из пути, а начальные цифры в имени файла извлекаются с использованием синтаксиса расширения расширения bash.

Если извлеченное число больше $print_if_greater, то полное имя пути отображается на стандартном выходе.

Этот скрипт вызывается с каталогом, который вы хотели бы изучить:

$ ./thescript.sh 'C:\scripts' 

или

$ bash ./thescript.sh 'C:\scripts' 

у меня нет доступа к Cygwin, так что я не смог чтобы проверить его с помощью оконных стилей. Если вышеуказанное не работает, попробуйте с C:/scripts в качестве пути.

+0

Спасибо Kusalananda !!! Его работа абсолютно прекрасна. Единственная проблема, с которой я столкнулся сейчас, - это просто не учитывать имя файла, который имеет. (точка) после номера. например. filename как '69 .hghgg.sql 'не отображается в результате после сравнения. –

+0

@JayeshSangle Хммм ... это для меня. Я даже установил Cygwin и протестировал его. У файла есть пробел в начале имени файла? – Kusalananda

0

Вы можете попробовать это:

DIR="C:\scripts" 
MAX=45 
for FILE in "$DIR"/* 
do 
    if 
    [[ "$FILE" =~ ^([0-9]+) ]] 
    then 
    NUMBER="${BASH_REMATCH[1]}" 
    if 
     [ "$NUMBER" -gt "$MAX" ] 
    then 
     echo "$FILE" 
    fi 
    fi 
done 

Пожалуйста, обратите внимание, я не проверял этот код. Это зависит от bash и предполагает, что числа всегда находятся в начале имени файла.

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