각 사용자의 홈 디렉터리에 파일을 복사하려고 합니다. 이상적으로 파일은 chown/chgrp여야 하지만 실제로는 제가 요구하는 것이 아닙니다. 내 진짜 질문은 와일드카드를 사용하여 각 하위 디렉터리를 선택하는 방법입니다.
$ touch testfile
$ sudo cp testfile /home/*/
이것은 파일을 현재 사용자의 디렉토리에 성공적으로 복사하지만 다른 모든 사용자에 대해서는
cp: omitting directory '/home/user2/'
cp: omitting directory '/home/user3/'
등. 귀하의 답변에 미리 감사드립니다.
답변1
cp
여러 대상은 허용되지 않으므로 루프를 직접 제공해야 합니다. 당신이하고 싶은 일과 직접적으로 동등한 것은
for homedir in /home/*; do sudo cp testfile "$homedir"; done
일반적인 참고 사항: 사용자 이름에 공백이 없다고 가정하고 홈 디렉터리가 정확히 의 디렉터리라고 가정합니다 /home
. 그렇지 않으면 홈 디렉터리 위치를 에서 가져와야 /etc/passwd
하지만 여기에는 시스템 사용자가 포함되므로 충분히 높은 UID, 그리고 사용자 UID의 시작 위치는 분포에 따라 다릅니다.
답변2
루프 내에서 이 작업을 수행하는 아이디어를 주신 @UlrichSchwarz에게 감사드립니다. 마음의 평화를 얻기 위해 일반 파일을 덮어쓰지 않았는지 확인하는 검사를 추가했습니다.
# First command-line arg is the file to be copied
for homedir in /home/* ; do
if [ -d "$homedir" ] ; then
cp $1 "$homedir"
user=$(ls -ld $homedir | awk '{print $3}')
chown --verbose $user:$user $homedir/$1
fi
done
이는 또한 그룹 및 사용자 소유권을 변경하는 "금상첨화" 문제에 대한 상대적으로 쉬운 솔루션의 문을 열어줍니다.
답변3
$ ls -1 /home/ | xargs -rI{} sudo cp testfile /home/{}/
설명하다
ls -1 /home/
모든 사용자 선택'은 모든 사용자의 홈 디렉토리를 선택하고 하나씩 나열합니다.
xargs -rI{}
표준 입력의 각 항목에 대해 다음 명령을 개별적으로 실행하여 {}
항목의 텍스트(이 경우 사용자 디렉터리)를 바꿉니다.
cp testfile /home/{}/
파일을 testfile
사용자의 홈 디렉터리에 복사합니다.