В OSX, как мне поместить имена файлов ограниченного системного каталога в массив?

Когда я вхожу в терминал

files=(/var/db/*); printf '%s\n' "${files[@]}"

и запустив его, я получаю список файлов в этой папке, но переход в ограниченный каталог TokenCache ничего не дает:

files=(/var/db/TokenCache/*); printf '%s\n' "${files[@]}"

Эта команда возвращает мне /var/db/TokenCache/*, а не файлы/папки внутри. Есть ли способ заставить его работать внутри папок с ограниченным доступом, поскольку sudo ls и даже sudo rm работают внутри? Например:

sudo ls -la /var/db/TokenCache

показывает его содержимое, а именно две папки config и tokens.


person IgorD    schedule 07.09.2017    source источник
comment
Итак, вы хотите просмотреть содержимое каталога, к которому у вашего текущего пользователя нет доступа для чтения?   -  person Moritz Sauter    schedule 07.09.2017
comment
По сути, да, я хотел бы знать, как включить sudo в мой пример.   -  person IgorD    schedule 07.09.2017


Ответы (2)


Ответ может быть примерно таким:

files=($(sudo ls "/var/db/TokenCache"))
printf '%s\n' "${files[@]}"

Но это безопасно только при условии, что указанная папка (в данном случае TokenCache) содержит только элементы без пробелов в имени.

Если вы хотите получить полный путь из массива для каждого файла, я бы предложил что-то вроде этого:

directory="/var/db/TokenCache"
files=($(sudo ls "${directory}"))
printf "${directory}/%s\n" "${files[@]}"

Обратите внимание, что ' изменилось на " в спецификаторе формата вызова printf. Это необходимо для расширения переменной оболочкой.

person Moritz Sauter    schedule 07.09.2017
comment
Есть ли способ указать полный путь к каждому элементу? - person IgorD; 07.09.2017
comment
Вы имеете в виду, что массив выглядит так: /var/db/TokenCache/config? Если это действительно необходимо, я бы посоветовал вам изучить , что ответ на SO - person Moritz Sauter; 07.09.2017
comment
Но имейте в виду, что пробелы на вашем пути сломают массив. Лично я бы предпочел сохранить путь в переменной (поскольку вы все равно должны указать его для вызова ls, который у вас есть) и добавить его как раз вовремя, когда вы используете один из элементов в files - person Moritz Sauter; 07.09.2017
comment
Я пробовал так, но не могу заставить его работать в сочетании с массивом. Не могли бы вы отредактировать приведенный выше код, чтобы он печатал полный путь, а затем я мог бы принять его как ответ, если он работает? - person IgorD; 07.09.2017
comment
Да, спасибо. У меня сейчас другие проблемы, но я, наверное, начну с другого вопроса. - person IgorD; 08.09.2017

Расширение глобуса происходит в оболочке, поэтому вам нужен экземпляр оболочки, работающий от имени пользователя с правильными разрешениями.

sudo bash -c 'files=(/var/db/*); printf "%s\n" "${files[@]}"'
person chepner    schedule 07.09.2017