Скопируйте один и тот же файл на рабочие столы всех пользователей

Если вы хотите разобрать сообщение целиком, используйте «адреса» вот так:

sed -n '/https:/h;/Path:/{H;g;s/\n/ /p;}' yourfile

Не выводить по умолчанию(-n). Поместите строку, начинающуюся с https:, в буфер хранения, затем для строки Path:добавьте ее в буфер хранения, переместите ее в пространство шаблонов и замените новую строку пробелом.

Или другой подход:

sed -e '/^https:/!d;:a' -e '$!N;/Path:/!ba' -e 's/\n\n*/ /' yourfile

Это означает :Если строка не начинается с https:, удалите ее(/^https:/!d). В противном случае запустите цикл (:a), чтобы добавить новые строки, если они есть ($!N), пока мы не добавим строку Path:. /Path:/!ba. Наконец, замените новые строки пробелом, чтобы поместить все в одну строку(s/\n\n*/ /).

1
29.08.2019, 13:06
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каталога.

Вы можете сделать это удобно с помощью GNUchown(из 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 {}
0
27.01.2020, 23:22

Ваш код расширяется как:

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

От человекаcp:

Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

Это означает, что он попытается скопировать "myfile /home/user1/Desktop/ /home/user2/Desktop/ /home/user3/Desktop/ /home/user4/Desktop/..." в /home/userN /Рабочий стол/

это выдаст ошибку, потому что кроме "myfile" все остальные каталоги where...

попробуй это,

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
3
27.01.2020, 23:22

Теги

Похожие вопросы