【问题标题】:run command on each path in list...how to do with loop?在列表中的每个路径上运行命令...如何处理循环?
【发布时间】:2018-07-02 21:33:39
【问题描述】:

我们需要将目标文件夹列表设置为 777。

请告诉我,这种循环有一种更清洁/更智能的方法,无需吐出文件,然后从文件中读取。 :)

#!/bin/bash

inputFile="/private/tmp/.swatchTempFolderList.txt"

echo '/Applications/Adobe\ Photoshop\ CC\ 2018/Presets/Color\ Books
/Applications/Adobe\ Photoshop\ CC\ 2017/Presets/Color\ Books
/Applications/Adobe\ Photoshop\ CC\ 2015.5/Presets/Color\ Books
/Applications/Adobe\ Photoshop\ CC\ 2015/Presets/Color\ Books
/Applications/Adobe\ Photoshop\ CC\ 2014/Presets/Color\ Books
/Applications/Adobe\ Photoshop\ CC/Presets/Color\ Books
/Applications/Adobe\ Illustrator\ CC\ 2018/Presets.localized/en_US/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC\ 2017/Presets.localized/en_US/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC\ 2015.3/Presets.localized/en_US/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC\ 2015/Presets.localized/en_US/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC\ 2014/Presets.localized/en_US/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC/Presets.localized/en_US/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC\ 2018/Presets.localized/en_GB/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC\ 2017/Presets.localized/en_GB/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC\ 2015.3/Presets.localized/en_GB/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC\ 2015/Presets.localized/en_GB/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC\ 2014/Presets.localized/en_GB/Swatches/Color\ Books
/Applications/Adobe\ Illustrator\ CC/Presets.localized/en_GB/Swatches/Color\ Books
/Applications/Adobe\ InDesign\ CC\ 2018/Presets/Swatch\ Libraries
/Applications/Adobe\ InDesign\ CC\ 2017/Presets/Swatch\ Libraries
/Applications/Adobe\ InDesign\ CC\ 2015/Presets/Swatch\ Libraries
/Applications/Adobe\ InDesign\ CC\ 2014/Presets/Swatch\ Libraries
/Applications/Adobe\ InDesign\ CC/Presets/Swatch\ Libraries' > "$inputFile"

while read f; do
    if [ -e "$f" ]; then
        echo "Setting 777 for $f..."
        chmod 777 "$f"
    else
        echo "Skipping, since $f does not exist..."
    fi
done < "$inputFile"

exit 0

【问题讨论】:

  • 这个 Shell 命令是什么语言?你想做什么?
  • 不要永远使用chmod 777。将文件标记为可由匿名帐户(例如用于沙箱不受信任的网络代码的那些)可执行和可写,从而规避了基本的系统安全措施。 775 更安全(使用组所有权来控制允许哪些其他用户进行写访问)。
  • ...如果这些都是目录,并且您确实想让匿名用户写入它们,那么您还需要设置+t 位,这(在目录上设置时)使这不那么不安全。
  • 完全同意将 files 设置为 777 的危险。但是,我们不会在文件夹 777 中制作文件,而只是在文件夹本身中制作文件。 Adobe 和 Pantone 都建议将列表中的每个文件夹设置为 777。这样没有管理员权限的 Adob​​e Photoshop、Illustrator 和 InDesign 用户可以创建或导入色板。

标签: bash macos loops


【解决方案1】:

您可以将所有文件转储到一个数组中:

arr=("file1" "file2" "file3")
chmod -- 777 "${arr[@]}"

如果您有 大量 文件,您可能会遇到 Argument list too long 错误。在这种情况下,您可以这样做:

printf '%s\0' "${arr[@]}" | xargs -0 chmod -- 777

或使用旧的for 循环:

for file in "${arr[@]}"; do
    chmod -- 777 "$file"
done

当然,您可以直接遍历文件:

for file in "file1" "file2" "file3"; do
    chmod -- 777 "$file"
done

【讨论】:

  • 可能使用-- 参数来确保变量内容被解析为名称,即使它们以破折号开头。虽然我意识到这是不可能的,但在没有警告的情况下通过重复来宽恕chmod 777 可能是不确定的。
  • 非常感谢所有反馈。很多好的建议。我使用了for 循环,因此将首先对其进行测试。完成后,我们当然会发布我们的结果。希望这将有助于下一个人。谢谢大家!
猜你喜欢
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多