我编写了一个基于扩展文件属性的备份系统。许多编辑程序(如 vim)会从它们编辑的文件中删除这些属性。我的想法是挂接任何引用文件的 bash 命令,以便将属性保存到变量或临时文件中。然后,后命令挂接会重新加载这些属性。我发现,可以使用 trap 在每个 bash 命令之前和之后运行任意命令,即添加:
trap date DEBUG
在 .bashrc 中,将在任何 bash 命令之前运行 date 命令。但是,我无法将其限制为处理文件的 bash 命令并获取文件名。我希望能够编写如下代码:
trap 'getfattr -d {} > /tmp/{}.xattr' FILECOMMAND
FILECOMMAND 意味着此钩子仅针对文件操作的命令执行
{} 是所操作文件的绝对文件路径
可以在命令后写入另一个钩子,以使用 /tmp/{}.xattr 的内容覆盖 {} 的文件属性
这可能吗?
另一个模糊的想法是挂钩写入文件的系统调用并在挂钩方法中执行一些代码,从而保留文件属性。
任何建设性的意见都将受到高度赞赏。
答案1
我最终编写了一个 python 脚本,使给定的命令 c 保留 c 作为参数获取的任何文件的文件属性。
这是通过修改此模板并将其附加到用户的 .bashrc 文件来实现的:
#preserve xattr for <COMMAND_NAME>
alias <COMMAND_NAME>='<FUNCTION_NAME>'
function <FUNCTION_NAME> ()
{
#find files in attribute list
for arg in "$@"
do
filesToPreserve=()
if [ -f "$arg" ];
then
#printf "argument: %s seems to be a file -> preserving attributes\n"
filesToPreserve+=("$arg")
fi
done
#save xattr
tempPathes=()
for file in "${filesToPreserve[@]}"
do
tempPath="/tmp/$file.attr"
getfattr -d "$file" > "$tempPath"
tempPathes+=("$tempPath")
done
#run actual command
<COMMAND_PATH> "$@"
#restore xattr
for p in "${tempPathes[@]}"
do
setfattr --restore="$p"
done
}
执行此操作的 Python 脚本可以在我的 github 上找到: 属性