【问题标题】:Change file permission for multiple file paths in a file更改文件中多个文件路径的文件权限
【发布时间】:2021-06-07 11:56:15
【问题描述】:

我有一个文件,它在文件内容中存储了多个文件路径,例如:

$ cat /var/tmp/sample
/etc/ssl/example/ssl-test1.cert
/etc/ssl/example/ssl-test2.cert
/etc/ssl/example/ssl-test3.cert
...

是否有单行命令循环文件中的文件路径并设置每个文件路径chmod 644 <file paths in /var/tmp/sample>的权限?

【问题讨论】:

    标签: linux puppet file-permissions chmod


    【解决方案1】:

    编辑:使用xargs -a /var/tmp/sample -d '\n' chmod 644


    你可以逐行读取文件

    while read -r filen; do
        chmod 644 -- "${filen}"
    done < /var/tmp/sample
    

    如果它必须只有一行

    while read -r filen; do chmod 644 -- "${filen}"; done < /var/tmp/sample
    

    但是,当文件名包含换行符时,这会出现问题。


    不要这样做,但如果由于某种原因你不想使用 while/read,你可以这样做

    chmod 644 -- $(</var/tmp/sample)
    

    如果文件名中有空格,这将中断。

    另一件你不应该但可以做的事情是使用内置的 mapfile。

    cm(){ chmod 644 -- "${2}"; }
    mapfile -t -c1 -C 'cm' < /var/tmp/sample
    

    mapfile 并不是真正为此目的而设计的,因此它可能比仅使用 xargs 慢很多。

    【讨论】:

      【解决方案2】:

      您可以运行以下命令来更改所有文件的权限。

      for i in `cat /var/tmp/sample`; do chmod 644 $i;done
      

      【讨论】:

      【解决方案3】:

      使用xargs

      xargs -d '\n' chmod 644 < /var/tmp/sample
      

      【讨论】:

      • xargs 是要走的路,比 while/read 循环更好,但你也可以这样做xargs -a /var/tmp/sample -d '\n' chmod 644
      【解决方案4】:

      xargs 的另一种使用方式:

      cat /var/tmp/sample | xargs -d '\n' chmod 644
      

      【讨论】:

      • 这很好,因为您可以将过滤器放入管道中(例如grep
      • 这是一个useless cat。除了打开两个管道之外,您还可以使用 grep -v 'filter' filepaths | xargs -d '\n' chmod 644 或者如果该命令仅读取标准输入 grep -v 'filter' &lt; filepaths | xargs -d '\n' chmod 644
      • @Nobody,你是对的,如果编写脚本,你的观点尤其重要。然而,在日常生活中,我几乎从不理会它,主要是因为我通常从find 获取文件,而不是从文件中获取。我会做类似find dir -type f -print0 | xargs -0 chmod 644 的事情,通常使用更复杂的查找命令...
      • @LuisGuzman 当然最好尽可能使用空字节作为分隔符。
      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2013-06-27
      • 2020-10-30
      • 2012-02-16
      • 2018-06-18
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多