2014-01-17 3 views
1

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

/path/to/vm.vmwarevm/vm.vmx 

Я хочу

/path/to/vm.vmwarevm 

Я знаю, что могу использовать

vmrun list|sed s/vmwarevm.*// 

Но это также удаляет vmwarevm. Есть ли способ сделать это, чтобы vmwarevm не удалялся?

ответ

4
$ echo "/path/to/vm.vmwarevm/vm.vmx" | sed -r 's/(.*)\/.*/\1/g' 
/path/to/vm.vmwarevm 

Но есть также dirname команда существует:

$ dirname "/path/to/vm.vmwarevm/vm.vmx" 
/path/to/vm.vmwarevm 
+0

Когда я пытаюсь это, я получаю СЕПГ: незаконный вариант - г – nickg

+0

Ну, '-r' специфичен флаг для GNU СЭД. Возможно, у вас есть BSD. –

+0

Спасибо, dirname работал. – nickg

5

Использование dirname:

$ dirname "/path/to/vm.vmwarevm/vm.vmx" 
/path/to/vm.vmwarevm 
+0

О, кстати: '' mypath = '- my-cool-path/to/file'; dirname "$ mypath" # fail''. Вы должны добавить '--' после dirname. –

2

Другие ответы хороши (я бы, вероятно, использовать dirname), но это также может быть сделано с использованием parameter expansion:

$ p="/path/to/vm.vmwarevm/vm.vmx" 
$ echo "${p%/*[!/]}" 
/path/to/vm.vmwarevm 
$ 
+0

Это лучший ответ, интересно, почему у него есть только один голос ... Все остальные ответы предлагают вам запустить отдельные инструменты (например, '' sed'' или '' dirname''), но этот ответ дает вам чистый bash без накладных расходов. –

1

Использование сборки в функции оболочки (я предпочитаю этот способ)

p="/path/to/vm.vmwarevm/vm.vmx" 
echo ${p%/*} 

Использование СЭД (без опции -r)

echo "/path/to/vm.vmwarevm/vm.vmx" | sed 's#/[^/]*$##' 

Кстати, dirname и basename не работают некоторые Unix-системы.

0
echo /path/to/vm.vmwarevm/vm.vmx | xargs dirname 
Смежные вопросы