将同一个文件复制到所有用户的桌面

将同一个文件复制到所有用户的桌面

我正在寻找一种将文件复制到每个用户的所有桌面目录的方法。

就像是:

cp myfile /home/*/Desktop/

我找到了一种将文件复制到所有主目录的方法,xargs但在子目录上失败了。

答案1

您的代码扩展为:

cp myfile /home/user1/Desktop/ /home/user2/Desktop/ /home/user3/Desktop/ /home/user4/Desktop/ ... /home/userN/Desktop/

来自 的人cp

将 SOURCE 复制到 DEST,或将多个 SOURCE 复制到 DIRECTORY。

这意味着,它将尝试将“myfile /home/user1/Desktop/ /home/user2/Desktop/ /home/user3/Desktop/ /home/user4/Desktop/ ...”复制到 /home/userN/Desktop/

它会抛出一个错误,因为除了“myfile”之外的所有其他目录...

尝试这个,

UserS=($(awk -F':' '{ if ( $3 >= 500 ) print $1 }' /etc/passwd))
for i in ${UserS[@]}
do
    [ -d /home/"$i"/Desktop ] && cp myfile /home/"$i"/Desktop
done

答案2

由于cp只需要一个目标名称,因此您必须将其设为循环并分别调用复制文件:

for destdir in /home/*/Desktop/; do
    cp myfile "$destdir"
done

xargs正如您所建议的,在这里使用可能会起作用,但会很麻烦:

printf '%s\n' /home/*/Desktop/ | xargs -I {} cp myfile {}

这依赖于子目录的名称/home中没有换行符(但我知道没有 Unix 允许在用户名中使用换行符)。

可以想象,您还想将文件的所有者更改为相应目录的所有者Desktop

您可以使用 GNU chown(来自 coreutils)方便地完成此操作,如下所示:

for destdir in /home/*/Desktop/; do
    cp myfile "$destdir" &&
    chown --reference="$destdir" "$destdir/myfile"
done

正在做xargs

printf '%s\n' /home/*/Desktop/ | xargs -I {} sh -c 'cp myfile "$1" && chown --reference="$1" "$1/myfile"' sh {}

相关内容