Если вы хотите разобрать сообщение целиком, используйте «адреса» вот так:
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*/ /
).
Так как 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 {}
Ваш код расширяется как:
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