各ユーザーのすべてのデスクトップディレクトリにファイルをコピーする方法を探しています。
それは次のとおりです。
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 {}