我正在寻找一种将文件复制到每个用户的所有桌面目录的方法。
就像是:
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 {}