【问题标题】:How to copy permissions from source folder into destination?如何将权限从源文件夹复制到目标?
【发布时间】:2013-12-05 01:31:08
【问题描述】:

我有两个包含相同层次结构和文件的包(目录)。我需要将源包中每个项目的权限复制到位于目标包中的文件中。我不应该复制文件,只复制权限。

是否可以使用 shell 脚本,或者我应该努力编写应用程序来做到这一点?

【问题讨论】:

  • 如果文件的 内容 确实相同,rsync 应该可以工作。它将仅复制需要复制的文件位(在这种情况下,仅复制文件元数据)。
  • 如果您执行find dir/ -printf "%m %f\n",您将从%m 获得权限。那我想一定是用-exec欺骗的问题...
  • @chepner: 不,内容不完全相同,但文件名/路径相同。
  • @fedorqui: 不知道如何把它放在一起......而且-printf 不存在osx

标签: macos bash shell scripting


【解决方案1】:

不是bash,而是zsh 在 OS X 中可用,因此您可以尝试以下操作(我使用 % 作为提示来指示您何时在 zshfor> 是次要的提示)

$ zsh
% for x in source/**/*; do
for> chmod $(stat -f "%p" $x) ${x/^source/dest}
for> done
% exit
$

for 循环递归地遍历source 下的所有文件。 stat -f "%p" $x 输出源目录中文件的权限,用作更改目标目录中相应文件的权限(即,将文件名中的“source”替换为“dest”)的命令的参数。

(实际上,该循环在bash 4 中也可以工作,但您可能已经注意到,OS X 仍然附带bash 3.2。)


作为一个名为foo.zsh的独立脚本:

#!/bin/zsh
for x in source/**/*; do
  chmod $(stat -f "%p" $x) ${x/^source/dest}
done

$ chmod +x foo.zsh
$ ./foo.zsh

或者干脆

$ zsh foo.zsh

【讨论】:

  • 哦,所以stat%p 打印权限。不知道,看起来比我的find 好多了。 +1
  • @chepner:从命令行运行时有效。但是,当我将其转换为脚本正则表达式部分时,它不适用于字符串标记的开头。如果我删除它,就会发生替换。奇怪的是,如果我回显$x,它给了我正确的开始,应该被替换。我可以忍受,但为了安全起见,我想知道问题出在哪里。
  • 听起来您可能正在创建 bash 脚本,而不是 zsh 脚本。我会更新的。
  • @chepner:我也是这样转换的。删除 ^ 使其工作。
  • 哦,对不起。我打算将source 锚定到字符串的开头,但使用了错误的字符。 ${x/#source/dest}.
猜你喜欢
  • 2017-03-31
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多