LINUX: список всех каталогов, вставка в массив bash - PullRequest
3 голосов
/ 18 января 2011

Вот конечный результат, который я пытаюсь:

У меня более 15 пользователей клонированного экземпляра моего приложения, иногда мне нужно обновить файлы (они почти все остаются неизменными - все динамично. Это для обновлений / новых функций). Я написал довольно простой bash-скрипт, который мне пришлось вручную помещать в массив каждого пользователя из / home /. Но мне нужно это масштабировать.

Как я могу получить список каталогов (что-то вроде команды LS), подающий ТОЛЬКО ИМЕНА ДИРЕКТОРИЙ в массив bash. Вероятно, я захочу эту команду в файле bash, потому что я хочу, чтобы он захватывал всех пользователей в каталоге / home /, вставлял в массив (например: webUsers (adam john jack)

Вот снимок того, как выглядит мой текущий скрипт (не динамический список пользователей)

webUsers( adam john jack )

for i in "${webUsers[@]}"
do 
 cp /home/mainSource/public_html/templates/_top.tpl /home/$i/public_html/templates
done 

Как мне этого добиться?

Ответы [ 4 ]

7 голосов
/ 18 января 2011

Сделайте это:

webUsers=(/home/*/)

и содержимое будет выглядеть так:

$ declare -p webUsers
declare -a webUsers='([0]="/home/adam/" [1]="/home/jack/" [2]="/home/john")'
$ echo ${webUsers[1]}
/home/jack/

Или, если вы не хотите, чтобы родительский каталог:

pushd /home
webUsers=(*/)
popd

и вы получите:

$ declare -p webUsers
declare -a webUsers='([0]="adam/" [1]="jack/" [2]="john")'
$ echo ${webUsers[1]}
jack/
3 голосов
/ 18 января 2011

Следующий скрипт зацикливает всех пользователей с каталогами в /home.Он также безоговорочно попытается создать каталог /public_html/templates.Если он еще не существует, он будет создан.Если существует , эта команда по существу ничего не делает.

#!/bin/bash

cd /home
userarr=( */ );

for user in "${userarr[@]%*/}"; do
   mkdir -p "/home/${user}/public_html/templates"
   cp "/home/mainSource/public_html/templates/_top.tpl /home/${user}/public_html/templates"
done
1 голос
/ 18 января 2011

Может быть проще сделать ссылку на исходный каталог, а затем вы можете просто обновить его в одном месте.

Просто настройте каждый каталог пользователей так, чтобы все общие файлы извлекались из каталога с именем common_files (или как вам угодно), а затем выполните эту команду в каждом домашнем каталоге:

ln -s /location/of/files/they/need common_files

update / location / of / files / они / нужны, и он автоматически распространяется.

0 голосов
/ 17 ноября 2014

С bash вы можете сделать это довольно коротким и простым.Чтобы отобразить текущий каталог и сохранить его в массиве:

ls . | readarray i

или

ls . | bash -c 'readarray i'

Для использования данных:

ls . | bash -c 'readarray i && for j in ${i[*]}; do <-command->; done'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...