我将一些旧文件/文件夹从 复制/srv/my-old-disk/_oldstuff/
到/srv/my-normal-disk/_oldstuff
。
我如何获得此分析/srv/my-old-disk/_oldstuff/
?
然后,如何将某些不需要的权限(例如 400)设置为批量的所需权限集(例如 644)的某些文件类型(文件、目录、链接)更改?
答案1
查找和排序 + uniq -c 和 perl 正则表达式
0) 创建必要的分析文件
A) 使用 find 和某些 -printf 标志获取列表
B) 使用 sort + uniq -c 获取统计信息
C) 获取不具有“正常”权限的文件/目录的列表
$ cd /srv/dev-disk-by-uuid-f0233da3-473e-450d-9a18-b2ae254fc439/_get/_move $ find . -printf "%m %y %p\n" > ~/filelist-1a-perms-type-path-findraw.txt $ cat ~/list-perms-type-path-findraw.txt | sort > ~/filelist-1b-perms-type-path-sorted.txt $ find . -printf "%m %y\n" > ~/filelist-1c-perms-type-findraw.txt $ find . ~/filelist-1c-perms-type-findraw.txt | sort | uniq -c | sort > ~/filelist-1d-perms-type-extraordinary.txt $ perl -ne 'print if /^(?!755 |644 )/' ~/filelist-1b-perms-type-path-sorted.txt ~/filelist-1f-perms-type-path-extraordinary.txt
然后您将获得具有以下示例性内容的以下文件。
〜/filelist-1a-perms-type-path-findraw.txt
find 的原始输出。
请注意, find 不是按字典顺序遍历,而是按文件系统的逻辑遍历(如果有人能准确解释如何进行,请发表评论)。
755 d . 644 f ./Installers-Notes.txt 644 f ./Installers-Bootdisk.txt 755 d ./Software 755 d ./Software/Multiplatform 644 f ./Software/Multiplatform/.DS_Store 644 f ./Software/Multiplatform/somesfiles.tgz 755 d ./Software/Multiplatform/Some Extensions 644 f ./Software/Multiplatform/Some Extensions/.DS_Store 644 f ./Software/Multiplatform/Some Extensions/some_plugin.xpi ...
〜/filelist-1b-perms-type-path-sorted.txt
从最左列到最右列排序
首先按权限,然后按类型(文件、目录、链接等),然后按文件路径。
如果需要,您还可以创建不同的排序顺序。
444 f ./Software/Mac/Software1.zip 444 f ./Software/Mac/Software5.cdr 444 f ./Software/Mac/Software7.zip ... 640 f ./Software/Mac/Software2.dmg 640 f ./Software/Mac/Software3/Software3.dmg 640 f ./Software/Mac/Software4.zip 640 f ./Software/Mac/Software6.dmg 640 f ./Software/Mac/Software7.zip ...
〜/filelist-1c-perms-type-findraw.txt
1c只是生成1d的辅助文件。
您也可以立即通过管道跳过它。
但对于需要很长时间的长列表,我更喜欢有中间文件,如果我在某个地方犯了错误,我不需要再次从头生成。
您稍后可以通过此离开。
755 d 644 f 644 f 755 d 755 d 644 f 644 f 755 d 644 f 644 f 644 f
〜/filelist-1d-perms-type-extraordinary.txt
该文件为您提供了一些统计数据。
基于此,您决定要在 1f“非凡”分析文件中列出哪些不常见的文件/文件夹,并相应地调整正则表达式。
2 555 f 6 700 d 7 645 f 13 600 f 20 444 f 22 700 f 57 640 f 124 744 f 423 777 l 12315 755 d 35606 755 f 60759 644 f
〜/filelist-1e-perms-type-extraordinary-annotated.txt
这只是一维的欺骗加上你的研究/想法的评论。
# Files: 2 555 f 7 645 f 13 600 f 20 444 f # Your remark here why this perms good/bad 22 700 f 57 640 f 124 744 f 35606 755 f 60759 644 f # Directories: 6 700 d 12315 755 d # Links: 423 777 l
〜/filelist-1f-perms-type-path-extraordinary.txt
- 该文件可帮助您进行分析,并在以后采取行动,例如批量更改权限。
- 你得到的这个文件的行开头是
perl -ne 'print if /^(?!755 |644 )/'
- 正则表达式解释:
线路起点
^
后面不跟
(?!expression)
这个就是所谓的否定前瞻表达式为
755
|
(逻辑或)644
请注意,数字后面的空格不是必需的,因为它们不是 4 位权限表达式,例如“7550”,它可能会不匹配。但我对此更加确定。
444 f ./Software/Mac/SoftwareA/File1.bom 444 f ./Software/Mac/SoftwareA/Fil2.pax.gz 444 f ./Software/Mac/SoftwareA/File3/Contents/PkgInfo 444 f ./Software/Mac/SoftwareA/File3/Contents/File1.sizes 444 f ./Software/Mac/SoftwareA/File3/Contents/File2.plist 444 f ./Software/Mac/SoftwareA/File3/Contents/File3.info ... 555 f ./Software/Mac/CategoryA/SoftwareB/README.txt 555 f ./Software/Mac/_Audio Production Software/Propellerheads Reason 5/Source.nfo 555 f ./Software/Mac/CategoryA/SoftwareC/Source.nfo ...
- 此文件列表应该可以帮助您了解哪些目录/文件可能需要调整。
- 您还可以使用 find 有选择地查找特定类型(文件/目录/链接)和具有特定权限的文件条目,然后将其更改为所需的其他权限。
查找具有特定权限集的文件/文件夹并将其更改为另一个权限集
假设您想要将权限从 444 更改为 644 的所有文件。
1) 让我们打印某个不需要的权限集的所有文件
$ find . -type f -perm 444 -printf "%m %y %p\n"
-type f
只查找文件-perm 444
拥有权限 444-printf
获得适当的输出来控制我们正在做的事情。- 注意
printf
应该是后所有过滤条件 - 否则, if 将打印到目前为止遇到的内容,但不会打印应用下一个过滤器链后剩下的内容。
- 注意
444 f ./Software/Mac/SoftwareA/File1.bom
444 f ./Software/Mac/SoftwareA/Fil2.pax.gz
444 f ./Software/Mac/SoftwareA/File3/Contents/PkgInfo
444 f ./Software/Mac/SoftwareA/File3/Contents/File1.sizes
444 f ./Software/Mac/SoftwareA/File3/Contents/File2.plist
444 f ./Software/Mac/SoftwareA/File3/Contents/File3.info
...
2)现在让我们批量更改它们
$ find . -type f -perm 444 -printf "%m %y %p\n" -exec chmod 644 {} \;
- 我们
-exec chmod 644 {} \;
在最后添加了 - 在每个通过过滤条件的文件上执行
chmod 644
- 您应该得到与上一步完全相同的列表(如果文件内容自那时以来没有更改)。
- 如果你遇到错误,你会额外得到它们。
3)最后检查是否执行良好
$ find . -type f -perm 444 -printf "%m %y %p\n"
- 与步骤 3 中相同的命令行
- 这次它应该返回 NULL(没有文件列表),因为在我们应用 find 的路径(这是
.
我们当时的当前工作目录)下面不应该再有 444 的文件