Не могли бы вы попробовать следующее:
IN=750
Input=test.txt
str="-rwxrwxrwx" # start with the full permissions
for (( i=0; i<${#str}; i++ )); do # loop from LSB to MSB
j=$(( 1<<i )) # j changes as 1, 2, 4, 8 ...
if (( ( 8#$IN & j ) == 0 )); then # the bit is "off"
str=${str:0:9-i}"-"${str:10-i:i}
# then replace the position with "-"
fi
done
# echo "$str" # just for debugging
sed -i "s/^[-rwx]\{10\}/$str/" "$Input" # update the permission string
Тогда test.txt
будет изменено как:
-rwxr-x--- test_1.txt
- Сначала оно определяет переменную
str
с полным разрешения для начала. - Затем проверяйте переменную
IN
от младшего бита к старшему биту по битам. - Если битовый фрагмент
IN
равен 0
, тогда замените связанный с ним пометьте символом da sh -
. - Наконец измените файл
Input
с вычисленной строкой.
Обратите внимание, что вам не нужно создавать while
l oop чтобы прочитать входной файл построчно. Sed
сделает итерацию за вас.