复制文件权限,但不复制Unix中的文件


14

(来自:https : //stackoverflow.com/questions/15245144/copy-file-permissions-but-not-files,已关闭,因为主题不正确)

我有同一目录树的两个副本。它们在两个文件中几乎都具有相同的文件(一个版本可能有几个额外的文件或丢失的文件)。但是,大多数文件在两个目录中都是相同的(相对路径和所有内容都相同)。

假设这些在目录中:

version1/
version2/

问题是版本1中的权限被弄乱了,我想从版本2中复制权限,但是这样做时不会替换版本1中的文件。

是否有通过shell命令或脚本自动执行此操作的方法?


在perl中有一个有用的脚本,您可以使用 serverfault.com/questions/373058/…–
NoNoNo

Answers:



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

5

您可以,但是我不认为这是“自动方式”!

GNU chown和GNU chmod具有--reference=RFILE可以使用的参数。

chown --reference=RFILE yourfile
chmod --reference=RFILE yourfile

它使用RFILE设置(权限,所有者,组等),并将其复制到yourfile

手册中有更详细的说明。


0

就我而言,我通过使用带有“ find”和“ vi”的“ stat”命令来创建应用权限的脚本来解决。

cd version1/
find . -exec stat -c '%a %n' "{}" \; > setPerm.sh
vi setPerm.sh

在“ vi”中插入“ chmod”命令的所有行:%s/^/chmod /g 将脚本复制到version2/目录中并执行。

其他解决方案似乎是有效的,但我不进行测试以防万一。


0

受马里亚诺·潘尼加(Mariano Paniga)答案的启发,我认为我有一个更好的答案,那就是不需要vi和搜索/替换命令。我什至也想复制所有权信息(uid / gid)。

cd version1/
find . -exec stat -c 'chmod %a %n; chown %U:%G %n' "{}" \; > /tmp/setPerm.sh
chmod u+x /tmp/setPerm.sh
cd ../version2
/tmp/setPerm.sh

您可以将命令自定义stat -c '...'为所需的任何内容。有关所有可用选项,请参见man stat


您的脚本是否处理带有嵌入式换行符的名称?
鹿猎人

@ deer-hunter应该按原样工作,否则,您可以在文件名部分周围添加引号“ ..”。
Tomofumi 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.