Скажите, что в данном каталоге я получил
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