すべてのユーザーのデスクトップに同じファイルをコピーします。

すべてのユーザーのデスクトップに同じファイルをコピーします。

各ユーザーのすべてのデスクトップディレクトリにファイルをコピーする方法を探しています。

それは次のとおりです。

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

宛先名は 1 つだけ必要なので、cpこれをループにしてコピーファイルを個別に呼び出す必要があります。

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

xargs提案したように、ここを使用すると効果があるかもしれませんが、面倒なことがあります。

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

/homeこれは、名前に改行文字が含まれていないサブディレクトリに依存します(ただし、私が知っているどのUnixもユーザー名に改行文字を許可しません)。

想像できるように、ファイルの所有者をそのディレクトリの所有者に変更したい場合がありますDesktop

chown次のように、GNU(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 {}

関連情報