Назад | Перейти на главную страницу

найти файлы, их имя меньше или больше заданного параметра

Скажите, что в данном каталоге я получил

tzury@x200:~/Desktop/sandbox$ ls -l
total 20
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P000
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P001
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P002
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P003
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N00.P004
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N01.P000
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N01.P001
drwxr-xr-x 2 tzury tzury 4096 2011-03-09 10:19 N01.P002

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

$ my_finder lt N00.P003

вернется N00.P000, N00.P001 и N00.P002

$ my_finder gt N00.P003

вернется N00.P004, N01.P000, N01.P001 и N01.P002

Я думал повторить for name in $(ls) и while $name != $2 но верю, что есть более элегантный способ сделать это

Никогда Когда-либо перебирать ls вывод!

Вот мое предложение:

for fn in *; do test "$fn" -$1 "$2" && echo "$fn"; done

Редактировать:

Сожалею. Вышеуказанные работы только если $ fn и $ 2 числовые. Вам нужно будет заменить - $ 1 на $ op и добавить селектор перед циклом. op="<" или op=">" в зависимости от $ 1 составляет lt или gtсоответственно.

for num in {001..003} ;do ls N00.P"$num"; done

Замените 003 лимитом, который вы хотите установить.

К сожалению для этой техники, /usr/bin/test не поддерживает STRING > STRING, однако встроенная оболочка test делает поэтому мы должны вызвать оболочку, чтобы иметь возможность использовать find -exec и избегайте цикла:

find $PWD -type f -exec sh -c 'test "{}" "<" "$PWD/N00.P004"' \; -print

Остается вопрос, является ли повторное создание оболочки более эффективным, чем выполнение цикла. Однако главное преимущество этого метода заключается в том, что вы можете выполнять рекурсивную обработку без канала.

Вы можете создать функцию, которая использует эту технику и позволяет вам использовать gt и lt вместо прохождения цитируемого < или >:

my_finder () { 
    local op=$1
    case "$op" in
        "gt") op='>';;
        "lt") op='<';;
           *) echo "Invalid operator"; return 1;;
    esac
    find $PWD -type f -exec sh -c 'test "{}" "$op" "$PWD/$2"' \; -print
}

Использование:

$ my_finder gt N00.P003
/home/tzury/Desktop/sandbox/N00.P004
/home/tzury/Desktop/sandbox/N01.P000
/home/tzury/Desktop/sandbox/N01.P001
/home/tzury/Desktop/sandbox/N01.P002