Как и сказал doneal24, вам, вероятно, нужно идти bc
.
Добавьте следующее в файл с именем fact.bc:
define f (x) {
if (x <= 1) return (1);
return (f(x-1) * x);
}
Теперь вы можете вызвать его в bc, предоставив файл :Например.
$>bc fact.bc <<< "scale=50;f(200)"
78865786736479050355236321393218506229513597768717326329474253324435\
94499634033429203042840119846239041772121389196388302576427902426371\
05061926624952829931113462857270763317237396988943922445621451664240\
25403329186413122742829485327752424240757390324032125740557956866022\
60319041703240623517008587961789222227896237038973747200000000000000\
00000000000000000000000000000000000
printf '%q\n' 'My Books/Pride & Prejudice.pdf'
даст желаемый результат. Вы можете использовать шаблон глобуса, например, printf '%q\n' *
, чтобы получить результаты для нескольких файлов.
В зависимости от варианта использования вы можете использовать комбинацию find+exec
вместо экранирования. Например, find -type f -name '*.txt' -exec cat {} +
правильно передаст совпадающие имена файлов команде cat
.
Еще один вариант: при условии, что имя вашего файла не содержит неприятных символов, таких как одинарные кавычки и перевод строки, вы можете вручную заключить имя файла в одинарные кавычки и передать его другой команде. Например:ls -l 'My Books/Pride & Prejudice.pdf'