Я получаю от пользователя определенный абсолютный filepath, и я хочу создать переменную, которая будет строкой, которая не будет включать только ПЕРВЫЕ два компонента пути к файлу, но не печатая его или чего-либо.
Например, полный путь мог быть:
/home/myusername/folder1/folder2/folder3
И это сохраняется в "target_path", и я хочу, чтобы "mydir" был только:
/folder1/folder2/folder3
Я пытался использовать команду сокращения по-разному, но без успеха.
Используя обработка строк удара :
$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3
Так, строка, которую Вы хотите, была бы (добавляющий назад ведущую наклонную черту):
b="/${a#/*/*/}"
Для переменной a
, ${a#foo}
удалит самое короткое сопоставление строк foo
из эти , запускаются из a
. Так, мы удаляем самую короткую строку, содержащую три /
(включая ведущую наклонную черту в пути), для удаления первых двух компонентов полного пути.
Вот пример с помощью cut
echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4-
folder1/folder2/folder3
при необходимости в продвижении /
, Вы могли бы добавить | sed 's/^/\//'
в конец Вашей строки.
Вам нужно -f4-
, потому что -d '/'
говорит cut
использовать /
в качестве разделителя между полями. Таким образом, первое поле прибывает перед первым разделителем в этом случае первое поле пусто. Так folder1
4-е поле, и -f4-
говорит сокращению использовать все поля от 4-го вперед.
Можно использовать расширение параметра удара как так:
target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"
После этого:
echo $myvar
дает:
/folder1/folder2/folder3
Это работает путем удаления первого соответствия шаблона /*/*/
от target_path переменной, при помощи ${target_path#pattern}
синтаксис расширения параметра оболочки. К сожалению, это удаляет первое /
символ, который является, почему тот символ должен быть явно включен при установке myvar переменной.
Предупреждение: необходимо проверить, что target_path переменная содержит некоторые символы и является дольше, чем двумя сегментами контура перед использованием этого метода. Например, если target_path=/home/username/
, то myvar=/
. Это могло быть опасно для Вашей системы при выполнении чего-то как rm -rf "$myvar"*
. не пробуют это!