Не повторяйте вывод find
.
Проблема, с которой вы столкнулись, является типичным следствием этого.
Ваш пример немного сложен из-за переименования файла.
Один не очень эффективный, но безопасный способ сделать это - использовать параметр -exec
в find
и дополнительный sh
для каждого файла, например:
find . -type f -iname "*.jpg" -exec sh -c 'echo convert "$1" -resize 800x800\> /home/user/thumbs/"${1%.jpg}_thumb.jpg"' -- {} \;
Если вы не возражаете, используйте то же имя (с суффиксом .jpg
вместо _thumb.jpg
), тогда эта простая форма будет работать и будет намного более эффективной:
find . -type f -iname "*.jpg" -exec echo convert "{}" -resize 800x800\> /home/user/thumbs/"{}" \;
Я добавил туда операторы echo
для проверки вывода перед выполнением команд. Удалите их, если результат выглядит хорошо.
Чтобы знакомые регулярные выражения работали, вам нужно включить «расширенные регулярные выражения» с помощью флага '-E'. При этом ваше регулярное выражение должно работать:
... | grep -E -o '[0-9]{4,16}'
Флаг -P
(Perl-совместимые регулярные выражения), поддерживаемый некоторыми дистрибутивами, в этом случае не нужен.
Если развернуть этот однострочник и немного переставить, плюс несколько настроек, получаем:
cat /dev/urandom | \
tr -dc 'a-zA-Z0-9' | \
fold -w 16 | \
tr -d '[A-z]' | \
grep '....' | \
head -n 16
Вывод:
7405935
60722
11225
96954
3966
8774
539418
1964
59150
5994
1086
7470
2751
8534
21501
14927
Примечание: n-значные числа вероятно, случайны, если брать их отдельно, но распределение длины цифр , а не . Вот результат 1000000, все цифры заменены на 'x', отсортированы, затем подсчитаны:
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | \
tr -d '[A-z]' | grep '....' | head -n 1000000 | \
tr '[0-9]' x | sort | uniq -c | nl -v 4
Вывод:
4 594210 xxxx
5 275196 xxxxx
6 96871 xxxxxx
7 26838 xxxxxxx
8 5738 xxxxxxxx
9 997 xxxxxxxxx
10 134 xxxxxxxxxx
11 14 xxxxxxxxxxx
12 2 xxxxxxxxxxxx
Мы видим, что чем больше цифр, тем меньше вероятность получения числа. В миллионных числах только два 12-значных и ни одно из 13-16-значных.