Мотивация для другого ответа
Мне нравится очень короткий, четкий, гарантированный код.Бонус, если он не запускает внешнюю программу, поскольку в тот день, когда вам нужно обработать огромное количество записей, это будет заметно быстрее.
Принцип
Не уверен насчет того, что у вас есть гарантиии хотите, так что предлагайте в любом случае.
Если у вас есть гарантии, вы можете сделать это с очень коротким кодом.Идея состоит в том, чтобы использовать функцию подстановки текста в bash, чтобы вырезать последнюю косую черту и все последующие.
Ответ от простых к более сложным случаям исходного вопроса.
Если путь гарантированно заканчивается безкосая черта (внутри и снаружи)
P=/home/smith/Desktop/Test ; echo "${P%/*}"
/home/smith/Desktop
Если путь гарантированно заканчивается ровно одной косой чертой (внутрь и наружу)
P=/home/smith/Desktop/Test/ ; echo "${P%/*/}/"
/home/smith/Desktop/
Если входной путь может заканчиваться нулем или одной косой чертой (не более) и вы хотите, чтобы выходной путь заканчивался без косой черты
for P in \
/home/smith/Desktop/Test \
/home/smith/Desktop/Test/
do
P_ENDNOSLASH="${P%/}" ; echo "${P_ENDNOSLASH%/*}"
done
/home/smith/Desktop
/home/smith/Desktop
Если входной путь может иметь много посторонних слешей и вы хотите, чтобы выходной путь заканчивался без косой черты
for P in \
/home/smith/Desktop/Test \
/home/smith/Desktop/Test/ \
/home/smith///Desktop////Test//
do
P_NODUPSLASH="${P//\/*(\/)/\/}"
P_ENDNOSLASH="${P_NODUPSLASH%%/}"
echo "${P_ENDNOSLASH%/*}";
done
/home/smith/Desktop
/home/smith/Desktop
/home/smith/Desktop