如何扫描文件夹以查找子文件夹,并将文件复制到每个输出


2

我在这里遇到一些问题。 下面是这样的情况:我们将很快部署一个新的应用程序,服务器配置位于一个简单的XML文件中,位于 ~/library/Preferences。我想创建一个bash / shell脚本,它基本上会在正确的位置复制XML文件,但是对于每个存在的用户文件夹。

我能够在Windows下使用以下脚本,但我想知道Apple是否有类似的东西。

这是Windows脚本:

$sourceLocation = "C:\Users\suptech\Downloads\TEMP"

$targetLocation = "C:\Users"

$result = @()

$result += get-ChildItem $targetLocation | Where-Object {$_.PSIsContainer}  
$result | foreach-Object { copy-item $sourceLocation -Destination "C:\Users\$_\AppData\Roaming\TEST” -Recurse -Force}

有人能帮助我吗?

提前致谢! :)

Answers:


3

嗯,这是你可以使用的东西。它未在真实环境中进行测试,并且按原样提供 - 没有任何保证。

# This script must run as root
if [ "$(id -u)" != "0" ]
then
    echo "This script must be run as root"
    exit 1
fi

source=/path/to/file
destination=Library/path/to/destination/directory

for u in /Users/*
do
    on=${u##*/}

    # If not a directory- do not process
    [ ! -d "$u" ] && continue

    # Check that the directory has a valid user name or do not process
    id "$on" >/dev/null 2>&1 || continue

    # Get the user's primary group id
    gn=$(id -gn "$on")

    # bug fix found by Alex Pilon
    # make destination directory if it doesn't exist
    install -o "$on" -g "$gn" -d "${u}/${destination}"

    install -b -o "$on" -g "$gn" -m 644 "$source" "${u}/${destination}"
done

另一种解决方案基于bmike的建议

# This script must run as root
if [ "$(id -u)" = "0" ]
then
    : running as root
else
    echo "This script must be run as root"
    exit 1
fi

source=/path/to/file
destination=Library/path/to/destination/directory 

dscl . -list /Users NFSHomeDirectory |
awk 'BEGIN { OFS=":" } / \/Users/ { print $1, $2 }' |
while IFS=: read u hdir
do
    # Get the user's primary group id
    gn=$(id -gn "$u")

    install -o "$u" -g "$gn" -d "${hdir}/${destination}"    

    install -b -o "$u" -g "$gn" -m 644 "$source" "${hdir}/${destination}"
done

1
好的脚本。我可能会迭代 dscl . -list /Users 捕获不在/中的主目录的用户,然后为通过过滤器测试的用户请求NFSHomeDirectory(可能排除root和带有_的用户) - dscl . -read /Users/${u} NFSHomeDirectory
bmike

@bmike这是一个好主意。
fd0

嘿@ fd0,谢谢你的回复。现在没有上班,但是我会在明天早上确定这个。而且bmike,这确实很有用,但在我们的情况下,笔记本电脑被强制配置,以便主目录始终在每个人/用户。
Alex Pilon

嘿@fd0抱歉延迟了。试过这个剧本,没有任何反应。知道发生了什么的唯一方法是,如果我注释掉两个“不处理”行。然后我得到'id:'??:没有这样的用户'和'安装:“??:无效的参数'。包括共享文件夹,我在计算机上有4个不同的用户,所有本地用户(没有网络帐户)。
Alex Pilon

没关系,工作正常。不得不玩它来使它创建文件夹,如果它们不存在,我想我搞砸了一些lol非常感谢你的脚本!这是一个很大的帮助
Alex Pilon

0

编写首选项文件是在OS X上执行操作的错误方法。特别是在10.9及更高版本中,缓存首选项并且甚至可能不使用该文件。

你会想要使用 defaults delete 删除首选项和 defaults write 设置首选项并让操作系统决定存储和缓存设置的位置/方式。

因此,您可以在任何地方编写代码来处理文件写入,只需使用API​​编写首选项即可。您可以使用脚本复制或写入文件的任何地方,使用该脚本进行调用 defaults 并适当地设置事物。

这是一个GitHub搜索,向您展示bash的使用示例 defaults write 让你入门: https://github.com/search?l=bash&q=defaults+write&ref=searchresults&type=Code&utf8=

不向每个用户帐户写入XML文件的原因是权限的分离。您需要处理在运行脚本后创建的新用户帐户,您需要管理员权限而非用户权限,这将破坏用户工作流程的一部分,并将阻碍您的应用程序的采用。有一个框架可以为应用程序编写系统级首选项,然后让用户覆盖或自定义这些设置 - 我的建议是使用这些框架,让您的生活更轻松,作为在OS X上运行的软件开发人员。


你没有正确阅读我写的内容。我自己引用一下: [...]驻留在一个简单的XML文件中[...]
Alex Pilon

我们这里不讨论PLIST文件,我们讨论的是应用程序读取的实际XML文件以获取服务器配置。
Alex Pilon

我想我是说 - 不要使用XML文件 - 你的电话@AlexPilon,虽然接受我的建议或离开它。我会在答案中解释原因。
bmike

1
我觉得你不明白......我没有选择!应用程序就是这样构建的。这不像我选择推动一些东西,我可以按照我想要的方式做到。在应用程序上配置服务器的唯一两种方法是从每个用户手动输入,或者通过将XML文件推送到正确的位置来自动配置。
Alex Pilon
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.