#!/bin/sh # This spell reads the enchanted attributes from the specified file. # If a field name is provided as the second argument, it reads the attribute with that name. # If the file or attribute does not exist, it raises an error. # Check that the correct number of arguments was provided if [ $# -lt 1 ] || [ $# -gt 2 ]; then echo "Error: This spell requires one or two arguments: a file path and an optional attribute name." exit 1 fi # Set the file path and attribute name variables file=$1 attribute=$2 # Check that the file exists if [ ! -f "$file" ]; then echo "Error: The file does not exist." exit 1 fi # Define a function to read the attribute value using the available commands read_attribute_value() { # Try to read the attribute using the 'attr' command attribute_value=$(attr -g "$1" "$2" 2> /dev/null | cut -d ":" -f 2 | xargs) # If the 'attr' command is not available, try using the 'xattr' command if [ -z "$attribute_value" ]; then attribute_value=$(xattr -p "$1" "$2" 2> /dev/null | cut -d ":" -f 2 | xargs) fi # If the 'xattr' command is not available, try using the 'getfattr' command if [ -z "$attribute_value" ]; then attribute_value=$(getfattr -n "$1" --only-values "$2" 2> /dev/null) fi # Return the attribute value echo "$attribute_value" } # If an attribute name was not provided, print all attributes in YAML format if [ -z "$attribute" ]; then attributes_found=0 # Define a function to process each attribute process_attribute() { # Read the attribute value using the read_attribute_value function value=$(read_attribute_value "$1" "$file") # Check if the attribute value was set if [ -n "$value" ]; then # Print the attribute and value in YAML format printf "%s: %s\n" "$1" "$value" attributes_found=$((attributes_found + 1)) fi } # Call the process_attribute function for each attribute for attribute in $(getfattr -m ".*" -e hex "$file" | cut -d ":" -f 1 | cut -d "." -f 2 | tr -d ' '); do process_attribute "$attribute" done # Check if no extended attributes were found if [ "$attributes_found" -eq 0 ]; then echo "No enchanted attributes found." fi # If an attribute name was provided, print the attribute value else # Read the attribute value using the read_attribute_value function value=$(read_attribute_value "$attribute" "$file") # Check if the attribute value was set if [ -z "$value" ]; then echo "Error: The attribute does not exist." exit 1 fi # Print the attribute value echo "$value" fi