Аналог "C:\Users\Public" (%Public%) в десктопном Linux

Мне понадобилось вытаскивать файлы .desktop на рабочий стол, чтобы пользователи не искали их в Start Menu.

Отсюда вопрос, eсть ли какая-то папка (желательно в стандарте freedesktop), как в Windows из заголовка вопроса?

Всем, кто захочет советовать /etc/skel, хочу напомнить, что это - только для НОВЫХ профилей.

Я умею в for i in $var ; do ; done, но не хочу.


Ответы (1 шт):

Автор решения: don Rumata

Т.к. стандарта нет или мы его не нашли, то сделал костыль (имхо, достаточно элегантный, но костыль).

Ставим пакет symlinks для чистки битых симлинков.

Создаём нужные папки каталоги:

tree /home/public/

/home/public/
├── Desktop
├── Documents
├── Downloads
├── Music
├── Pictures
├── Public
├── Templates
└── Videos

Разрешаем всем read only:

chmod -R 755 /home/public/

Создаём .desktop файл для автозагрузки:

/etc/xdg/autostart/create-symlinks-to-desktop-from-public-directory.desktop

[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=Create symlinks 4 any files in %Public% 4 current user
Comment=https://ru.stackoverflow.com/q/1438407/191416
Exec=/usr/local/bin/create-symlinks-to-desktop-from-public-directory.sh
RunHook=0
StartupNotify=false
Terminal=false
Hidden=false

и скрипт:

/usr/local/bin/create-symlinks-to-desktop-from-public-directory.sh

#!/usr/bin/env bash

# Получаем переменные XDG_*
source "$HOME/.config/user-dirs.dirs"
# Создаём симлинки из всего, что находится в "%Public%/Desktop" для рабочего стола конкретного пользователя.
ln -s /home/public/Desktop/* "$XDG_DESKTOP_DIR"/
# Переходим в папку рабочего стола.
cd "$XDG_DESKTOP_DIR"
# Чистим битые симлинки, если из "%Public%/Desktop" было что-то удалено - у пользователя оно тоже почистится.
symlinks -d ./

В итоге - всё, что будет кидаться (rsync\curl\ssh\ansible\mount.nfs\руками) в /home/public/Desktop - при логоне пользователя будет копироваться в виде ярлыка на его рабочий стол. При удалении из /home/public/Desktop - симлинк у пользователя будет становиться битым и удаляться.

Всё тоже самое, но через ansible:

---
# WORK
  - name: Config directory %Public%
    hosts: all
    strategy: free
    serial:
      - "100%"
    vars:
      paths_to_public_directory:
        root: /home/public
        user_dirs:
          desktop: Desktop
          downloads: Downloads
          templates: Templates
          public: Public
          documents: Documents
          music: Music
          pictures: Pictures
          videos: Videos
    tasks:

# https://ru.stackoverflow.com/q/1438407/191416
# /etc/xdg/user-dirs.defaults
    - name: Config %Public% 4 Linux
      when: ansible_system == 'Linux'
      become: yes
      block:
        - user:
            name: public
            system: yes
            state: present
            create_home: yes
            home: "{{ paths_to_public_directory.root }}"
            comment: "ru.stackoverflow.com/q/1438407/191416"
            expires: -1
        - acl:
            path: "{{ paths_to_public_directory.root }}"
            etype: other
            permissions: rx
            default: yes
            recursive: yes
            state: present
        - file:
            path: "{{ paths_to_public_directory.root }}"
            state: directory
            mode: '755'
        - file:
            path: "{{ paths_to_public_directory.root }}/{{ item.value }}"
            state: directory
            mode: '755'
          with_dict: "{{ paths_to_public_directory.user_dirs }}"

    - name: Create symlinks 4 any files in %Public% 4 current user
      when:
        - ansible_system == 'Linux'
      become: yes
      block:
        - copy:
            dest: /etc/xdg/autostart/create-symlinks-to-desktop-from-public-directory.desktop
            content: |
              [Desktop Entry]
              Encoding=UTF-8
              Type=Application
              Name=Create symlinks 4 any files in %Public% 4 current user
              Comment=https://ru.stackoverflow.com/q/1438407/191416
              Exec=/usr/local/bin/create-symlinks-to-desktop-from-public-directory.sh
              RunHook=0
              StartupNotify=false
              Terminal=false
              Hidden=false
            mode: '644'
        - copy:
            dest: /usr/local/bin/create-symlinks-to-desktop-from-public-directory.sh
            content: |
              #!/usr/bin/env bash

              # Получаем переменные XDG_*
              source "$HOME/.config/user-dirs.dirs"
              # Создаём симлинки из всего, что находится в "%Public%/Desktop" для рабочего стола конкретного пользователя.
              ln -s {{ paths_to_public_directory.root }}/Desktop/* "$XDG_DESKTOP_DIR"/
              # Переходим в папку рабочего стола.
              cd "$XDG_DESKTOP_DIR"
              # Чистим битые симлинки, если из "%Public%/Desktop" было что-то удалено - у пользователя оно тоже почистится.
              symlinks -d ./

            mode: '755'
→ Ссылка