使用 tar 时保留目录的隐藏属性

使用 tar 时保留目录的隐藏属性

下面是我编写的 shell 脚本,用于自动执行将特定 Vue 项目复制到 Windows 11 计算机上的另一个位置的任务:

# declare and initialize variables
source="/z/files/development/vue/code/project17"
target="/c/users/knot22/desktop/temp_dev"

# display contents of variables to user; ask user whether or not to proceed; act accordingly
echo -e "\nCopy from: ${source}"
echo -e   "Copy to:   ${target}\n"

read -p "Proceed? (y/n) " proceed
echo

if [[ ${proceed^^} == Y ]]; then    
    IFS='/' read -ra PARTS <<< "${source#/}"        # split $source string, without leading /, into array called PARTS using / as delimiter
    arrayLength="${#PARTS[@]}"
    tar -c --exclude="node_modules" -C / "${source#/}" | tar -x -C "/${target#/}" --strip-components="$(($arrayLength - 1))"
    echo -e "Copy operation is complete\n"
else
    echo -e "Operation aborted\n"
fi

它会将除目录之外的所有内容复制到新位置node_modules,这正是其预期的行为方式。不过,还有改进空间。.git源位置中的目录是隐藏的,但当将其复制到目标位置时,隐藏属性不会被带走。有没有办法保留该属性?我搜索了 man tar,但没有找到任何关于保留隐藏属性的内容。

答案1

Tar 不支持“隐藏”文件系统属性。43tar年前创建,用于将 Unix 系统备份到磁带(应收账chive)。Unix 上的隐藏文件是文件名以 开头的文件.,因此 Unix 文件系统(或实用程序)无需支持此类标志。

Tar 甚至没有支持此功能的元数据字段。事实上,GNU tar 甚至不支持 Linux 风格的 acl。

正如所述维基百科tar 格式

另外,您可以使用attribWindows 实用程序在复制后设置隐藏属性。它似乎还rsync支持隐藏文件(我自己还没有确认)。rsync无论如何,使用似乎是一个更好的主意,因为它是为复制复杂的目录结构而创建的。

相关内容