Я хочу цикл рекурсивно через каждый файл и каталог ниже в указанном пути и эха этого файла/каталог в владельце и имени.Портативное решение перебрать каталог рекурсивно в Баше 3.2
Я нашел это question, чтобы быть хорошей ссылкой, но я хотел бы знать, есть ли bash 3.2
портативное и более простое решение проблемы. Решение без использования find
было бы превосходным.
Я также обнаружил, что есть shopt -s globstar
, но я не знаю, переносится оно или нет.
Если вы посмотрите на мой скрипт, вы увидите, что log_owners
просто петли над [email protected]
, так что, возможно, проблема в моем шаблоне glob. Я думал, что log_owners $root/**
будет проходить через все, но это не так.
# OSX check.
darwin() {
[ $(uname) = "Darwin" ]
}
# Get file/directory's owner.
owner() {
if [ -n "$1" ]; then
if darwin; then
stat -f "%Su" "$1"
else
stat -c "%U" "$1"
fi
fi
}
log_owners() {
for file in [email protected]; do
echo $(owner "$file")"\t$file"
done
}
Я использую sh
/bash 3.2
.
попробуйте запустить 'time find/base/dir -ls' vs' time loop/base/dir' или достаточно крупную структуру dir. Информация hh: mm: ss в конце поможет вам решить, является ли это хорошим подходом или нет. Кроме того, вы не определили портативность. Портативный, как в совместимом с POSIX, или как совместимый с/bin/sh, или, как вы, кажется, говорите портативный = «старейшая возможная версия bash». ;-) Удачи! – shellter
Я вижу, я думаю, что имел в виду '/ bin/sh' совместимый. Я думаю, что рекурсивные функции, хотя и простые, очень медленные. –
Как бы то ни было, он не совместим с/bin/sh. Синтаксис '$()', синтаксис globstar, команда 'owner' не являются/bin/sh. Какие операционные системы/машины будут работать? –