2013-11-20 46 views
0

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

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

+0

如果该文件的内容*真的*是相同的,'rsync'应该可以工作。它将只复制需要复制的文件的位(在这种情况下,仅复制文件元数据)。 – chepner

+0

如果您执行'find dir/-printf'%m%f \ n“',您将从'%m'获得权限。那么我想这肯定是用'-exec'欺骗的问题...... – fedorqui

+0

@chepner:不,它的内容不完全相同,但文件名/路径相同。 – Pablo

回答

2

这不是bash,但zsh是在OS X中,所以你可以尝试以下的(我使用%的提示,表示当你在zsh; for>是次要提示符)

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

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

(实际上,这个循环将在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 
+0

哦,所以''p'的'stat'打印权限。不知道,看起来比我的'find'更好。 +1 – fedorqui

+0

@chepner:它从命令行运行时起作用。但是,当我将其转换为脚本正则表达式部分不适用于字符串标记的开始。如果我删除它,替换发生。奇怪的是,如果我回显'$ x',它给了我正确的开始,这应该被替换。我可以忍受这一点,但为了安全起见,我想知道问题在哪里。 – Pablo

+0

听起来你可能正在创建一个'bash'脚本,而不是'zsh'脚本。我会更新。 – chepner

相关问题