Mar*_*iga 14 unix copying unix-shell file-permissions
(来自:https : //stackoverflow.com/questions/15245144/copy-file-permissions-but-not-files,因为离题而关闭)
我有两个相同目录树的副本。它们几乎具有相同的文件(一个版本可能有几个额外的或丢失的文件)。但是,大多数文件对于这两个目录都是通用的(具有相同的相对路径和所有内容)。
假设这些在目录中:
version1/
version2/
Run Code Online (Sandbox Code Playgroud)
问题是 version1/ 中的权限搞砸了,我想从 version2/ 复制权限,但不要替换 version1/ 中较新的文件。
是否有通过 shell 命令或脚本自动执行此操作的方法?
she*_*n89 14
我的版本cp
没有--attributes-only
标志,所以我解决了这个问题。在简单文件夹 YMMV 上进行了简要测试。
$> ls
version1/
version2/
$> ls -l version1/1/a
-rw-rw-r-- 1 alex alex 0 Feb 5 12:49 version1/1/a
$> ls -l version2/1/a
-rwxrwxrwx 1 alex alex 0 Feb 5 12:49 version1/1/a
$> find version1 -type f -printf '%P\n' | xargs -I {} \
chmod --reference=version1/{} version2/{}
$> ls -l version2/1/a
-rw-rw-r-- 1 alex alex 0 Feb 5 12:49 version1/1/a
Run Code Online (Sandbox Code Playgroud)
小智 5
你可以,但我不认为“自动化的方式”!
GNU chown 和 GNU chmod 有一个--reference=RFILE
您可以使用的参数。
chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile
Run Code Online (Sandbox Code Playgroud)
它使用RFILE
设置(权限、所有者、组等)并将它们复制到yourfile
.
手册有更详细的解释。
就我而言,我通过使用“stat”命令与“find”和“vi”来创建应用权限的脚本来解决。
cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh
Run Code Online (Sandbox Code Playgroud)
在“vi”中,我将“chmod”命令插入到所有行中:%s/^/chmod /g
我将脚本复制到version2/
目录中并执行它。
其他解决方案似乎有效,但我没有测试它们以防万一。