如何编写一个shell脚本,创建具有所有可能权限的空文件。文件名应该是,例如,rwxrw_r__. txt。我知道如何手动完成。例如:
# !/bin/bash
touch task5/rwxrwxrwx.txt | chmod 777 task5/rwxrwxrwx.txt
touch task5/rwxr-xr-x.txt | chmod 755 task5/rwxr-xr-x.txt
touch task5/rwx------.txt | chmod 700 task5/rwx------.txt
touch task5/rw-rw-rw-.txt | chmod 666 task5/rw-rw-rw-.txt
touch task5/rw-r--r--.txt | chmod 644 task5/rw-r--r--.txt
touch task5/rw-------.txt | chmod 600 task5/rw-------.txt
我不知道如何编写一个脚本,该脚本将根据所需的模板创建文件并给予它们权限
3条答案
按热度按时间kcugc4gi1#
执行循环:
如果您希望名称看起来像
ls -l
的输出,请执行以下操作,而不是尝试构造名称xqkwcwgp2#
这只是一个排列问题。
备注
让我们把它分解一下,看看发生了什么。
如果您对权限集的含义或
chmod
的工作原理有任何疑问,请访问see here。因此,对于每个用户、组或其他,都有八种可能的符号表示(表示一个八进制数字0-7的值)。
我们将它们设置为一个简单的数组,可以循环访问。
你可以访问任何一个八进制数的元素(技术上相当于十进制数,但这并不重要,除非你超过7),所以
${p[5]}
是r-x
。用@
索引返回整个数组,所以循环用${p[@]}
顺序遍历它们。为了得到每个可能的排列,我们对每个用户/组/其他进行循环。
这仅仅是嵌套循环中的简单迭代,以命中每个排列。
通过将路径和文件名信息放入一个变量中,我们可以在一个地方维护任何更改,这使得该行的其余部分更短,更容易阅读。
touch
将创建一个空文件,因为文件名 * 有时 * 会以破折号开始(任何时候权限不允许用户读取),我们给予touch
一个--
的第一个参数,这是一个 *NIX标准习惯用法,意思是“现在完成选项,剩下的都是参数”;否则它会试图将前导破折号解释为无效的选项集并失败。当您将“task 5/”放在文件名的开头时,这不会有问题,但如果您最终使用文件名bare,则会有问题。&&
是一个布尔测试,用于查看touch
是否成功。如果没有成功,我们将自动跳过chmod
(touch
应该会为您的调试发出一条错误消息,但如果失败,您可能会收到大量错误消息,并且需要修复任何错误...)这里使用了
chmod
的符号模式。我们拥有下一个循环中每个部分的权限--只需要应用它们。同样,我们使用--
来告诉chmod
我们什么时候完成传递选项,这样如果你只把cd
重构到目录中并在本地创建文件,文件名中的前导破折号就不会是一个问题。但即使这样,您也可以在其上添加前缀./
或$PWD/
。我们必须去掉符号文件模式中的w破折号,因为(再次感谢@kvantour)
chmod
无法识别这些破折号。内联字符串编辑工作得很好:在"u=${u//-/},g=${g//-/},o=${o//-/}"
中,变量规范中的//
是所有出现的替换,将-
替换为后面的/
和}
之间的 nothing。我们可以(也可能应该)把每一行放在不同的行上,但解释器并不在意,因为我们使用了分号,它让我们压缩代码,把循环嵌套和闭包放在同一行上,只要你觉得改变的那一件事足够明显就行。
还有什么我没说的问题吗?
备选
另一个版本,因为我喜欢经历一次循环,而不是嵌套的shenannigans...
这将以数字方式遍历组合,使用
printf
将十进制转换为八进制,使用基本的子字符串解析将八进制权限集中的每一位数切片,并使用它从数组中查找相关的字符串,分配段,分配结果文件名,touch
/创建文件,然后使用chmod
应用清理后的权限字符串。虽然有点难以理解。按照建议,要跳过十进制到八进制的转换步骤,请替换:
与
wwodge7n3#
根据Paul Hodges的回答-这是一个排列问题-但是,这种方法在内存数据库中使用bash和SQLite来生成一个受此网页启发的数据集,https://towardsdatascience.com/unix-permissions-the-easy-way-98cc19979b3e从八个记录中创建一个笛卡尔积-生成命令并将八进制与用户组所有权限集放在一起
chmod的八进制在此方法中进行了说明-这与原始请求更加一致
输出如下所示(如果性能确实存在问题,则大约需要40秒
前几个文件