2026-07-22 16:39:23 +03:00

43 lines
978 B
Bash
Executable File

#!/bin/sh -eu
# flipbit - Toggle (flips) bit on file for owner only
if [ "${#}" -ne 2 ]; then
echo "Usage: ${0} [rwx] file"
exit 1
fi
mode="${1}"
file="${2}"
if [ ! -e "${file}" ]; then
echo "File not found"
exit 1
fi
# Get current permissions in octal format (3 digits: owner, group, other)
perms=$(stat -c "%a" "${file}")
# Extract owner permissions (first digit)
owner_perm=$(echo "${perms}" | cut -c1)
# Convert to decimal for bit manipulation
owner_dec=$((owner_perm))
# Toggle bits for owner only
for char in $(echo "${mode}" | sed 's/./& /g'); do
case ${char} in
r) owner_dec=$((owner_dec ^ 4)) ;;
w) owner_dec=$((owner_dec ^ 2)) ;;
x) owner_dec=$((owner_dec ^ 1)) ;;
esac
done
# Keep group and other permissions unchanged
group_perm=$(echo "${perms}" | cut -c2)
other_perm=$(echo "${perms}" | cut -c3)
# Construct new permissions
new_perms="${owner_dec}${group_perm}${other_perm}"
chmod "${new_perms}" "${file}"